]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
generate-sym-test: search for missing symbols
authorLennart Poettering <lennart@poettering.net>
Tue, 2 May 2023 09:21:23 +0000 (11:21 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 2 May 2023 09:30:46 +0000 (11:30 +0200)
This slightly extends the symbol file test and checks which symbols are
listed in one list but missing in the other. This is tremendously useful
to quickly determine which symbols wheren't exposed properly but should
have been.

(This is is implemented in pure C, no systemd helpers, to ensure we see
libsystemd.so API as any other tool would.)

src/test/generate-sym-test.py

index a2ad4547bff77b98aa65bfca1a5e919eb4947881..0d220d9a283fff80e099891e0cc55563647ad510 100755 (executable)
@@ -40,6 +40,8 @@ print('''/* SPDX-License-Identifier: LGPL-2.1-or-later */
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+
 ''')
 
 for header in sys.argv[3:]:
@@ -51,10 +53,11 @@ print('''
 ''')
 
 print('''
-static const struct {
+struct symbol {
         const char *name;
         const void *symbol;
-} symbols_from_sym[] = {''')
+};
+static struct symbol symbols_from_sym[] = {''')
 
 with open(sys.argv[1], "r") as f:
     process_sym_file(f)
@@ -70,9 +73,17 @@ for dirpath, _, filenames in os.walk(sys.argv[2]):
 print('''        {}
 };
 
+static int sort_callback(const void *a, const void *b) {
+        const struct symbol *x = a, *y = b;
+        return strcmp(x->name, y->name);
+}
+
 int main(void) {
         size_t i, j;
 
+        qsort(symbols_from_sym, sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0])-1, sizeof(symbols_from_sym[0]), sort_callback);
+        qsort(symbols_from_source, sizeof(symbols_from_source)/sizeof(symbols_from_source[0])-1, sizeof(symbols_from_source[0]), sort_callback);
+
         puts("From symbol file:");
         for (i = 0; symbols_from_sym[i].name; i++)
                 printf("%p: %s\\n", symbols_from_sym[i].symbol, symbols_from_sym[i].name);
@@ -85,5 +96,17 @@ int main(void) {
         printf("Found %zu symbols from symbol file.\\n", i);
         printf("Found %zu symbols from source files.\\n", j);
 
+        for (i = 0; symbols_from_sym[i].name; i++) {
+                struct symbol*n = bsearch(symbols_from_sym+i, symbols_from_source, sizeof(symbols_from_source)/sizeof(symbols_from_source[0])-1, sizeof(symbols_from_source[0]), sort_callback);
+                if (!n)
+                        printf("Found in symbol file, but not in sources: %s\\n", symbols_from_sym[i].name);
+        }
+
+        for (j = 0; symbols_from_source[j].name; j++) {
+                struct symbol*n = bsearch(symbols_from_source+j, symbols_from_source, sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0])-1, sizeof(symbols_from_sym[0]), sort_callback);
+                if (!n)
+                        printf("Found in sources, but not in symbol file: %s\\n", symbols_from_source[i].name);
+        }
+
         return i == j ? EXIT_SUCCESS : EXIT_FAILURE;
 }''')