summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-05-02 11:21:23 +0200
committerLennart Poettering <lennart@poettering.net>2023-05-02 11:30:46 +0200
commit4f65fbe9901b5db7d262c72c54813ed9c80a3544 (patch)
tree64226af84913085c2fef52ceb91b0389802b80a1 /src/test
parentab13274a19ee310ed8569612a862b977d054ed6c (diff)
downloadsystemd-4f65fbe9901b5db7d262c72c54813ed9c80a3544.tar.gz
generate-sym-test: search for missing symbols
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.)
Diffstat (limited to 'src/test')
-rwxr-xr-xsrc/test/generate-sym-test.py27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/test/generate-sym-test.py b/src/test/generate-sym-test.py
index a2ad4547bf..0d220d9a28 100755
--- a/src/test/generate-sym-test.py
+++ b/src/test/generate-sym-test.py
@@ -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;
}''')