Recentemente ho imparato più C++ e ho avuto una domanda simile. La maggior parte delle librerie e delle intestazioni sembrano almeno condividere un nome simile, ma le differenze tra "libm" e "math.h" mi hanno davvero chiesto come determinarlo in modo più sistematico.
Per entrambe le librerie statiche e dinamiche, uno strumento che ho trovato utile è readelf
e il comando che mi piace è questo:
readelf --symbols <elf_file> | sed -ne '/FUNC/p'
Così, per il mio esempio motivante:
$ readelf --symbols /lib/libm.so.5 | sed -ne '/FUNC/p'
2: 0000000000000000 476 FUNC WEAK DEFAULT UND [email protected]_1.0 (8)
4: 0000000000000000 62 FUNC GLOBAL DEFAULT UND [email protected]_1.0 (8)
5: 0000000000000000 310 FUNC GLOBAL DEFAULT UND [email protected]_1.0 (8)
6: 0000000000000000 41 FUNC GLOBAL DEFAULT UND [email protected]_1.0 (8)
9: 0000000000000000 8 FUNC GLOBAL DEFAULT UND [email protected]_1.0 (8)
11: 0000000000000000 16 FUNC GLOBAL DEFAULT UND [email protected]_1.0 (8)
12: 0000000000000000 53 FUNC GLOBAL DEFAULT UND [email protected]_1.0 (8)
14: 0000000000000000 84 FUNC GLOBAL DEFAULT UND [email protected]_1.0 (8)
16: 0000000000004ed0 6 FUNC GLOBAL DEFAULT 12 [email protected]@FBSD_1.0
17: 0000000000019930 405 FUNC GLOBAL DEFAULT 12 [email protected]@FBSD_1.3
18: 0000000000016590 600 FUNC GLOBAL DEFAULT 12 [email protected]@FBSD_1.0
...
Questo comando funziona anche per i file di archivio ar
come libcurl.a.
Così qui si possono vedere le funzioni definite nella libreria. Da lì ho confrontato visivamente i nomi nella colonna finale come "log10l" con quelli nel file di intestazione /usr/include/math.h e ho trovato un'alta corrispondenza. Mi sembra possibile scrivere un programma basato su questo. Analizzare la colonna finale del comando readelf in alto e fare un grep per tutti i file .h
in/usr/include. Non l'ho preso così lontano, però.
Dopo aver eseguito alcuni esperimenti relativi alla mia risposta, ho scoperto che il comando sed
potrebbe probabilmente essere ulteriormente rifinito per le vostre esigenze. Quando ho usato readelf
su libcurl.a, anche le funzioni non globali (quindi, quelle che non devono essere incluse nei file di intestazione) vengono emesse.
Stai avendo "versione" diversa (come uno filettato, una statica, etc.) della stessa libreria, o è più librerie davvero diversi tutti messi in una singola directory? –
più librerie diverse –
per Linux (almeno Debian e Kubuntu con i fratelli), installare apt-file e cercare 'ricerca di apt-file'. Spero che le distribuzioni basate su rpm come suse e redhat abbiano qualcosa di simile. –