Undefined symbol quand vous essayez de charger une bibliothèque avec dlopen

Je suis en train de charger une bibliothèque partagée (plugin), j'ai été fournis (à code source fermé) avec dlopen sous Linux plate-forme ARM. Je suis en train de charger de cette façon:

void* handle = dlopen(<library_path>/<library_name>, RTLD_NOW);

Le résultat est un échec avec ce message:

Failed to load <library_path>/<library_name>: undefined symbol: <symbol_name>.

J'ai essayé de regarder à l'intérieur de la bibliothèque nm, mais il semble que le lib a été dépouillé, aucun indicateur n'a pu être trouvé. J'ai aussi essayé d'utiliser readelf -s, et, en fait, j'ai obtenu ce résultat:

12663: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND <symbol_name>

Par la lecture autour, j'obtiens que readelf -s retourne tous les symboles, y compris ceux des symboles définis dans les bibliothèques référencées par.

Les réponses à cette question ne sont pas complètement clair pour moi: est-ce un symbole qui est censé être dans la bibliothèque et qui n'est pas là parce qu'il a été compilé de la mauvaise façon ou est-ce un symbole que je suis censé trouver un autre endroit? La sortie de readelf -d semble suggérer que je suis fournissant toutes les bibliothèques partagées. Peut cette erreur liées à une erreur dans la façon dont je compile mon fichier exécutable ou est-ce quelque chose n'est pas liée à la chargeur?

Aussi, j'ai lu à propos de la signification de chaque colonne, mais ces valeurs sont tout à fait étrange. Comment interprétez-vous que le symbole description? Pourquoi est l'adresse 0? Pourquoi est type NOTYPE?

Utilisation nm -D au lieu de simplement nm.
Êtes-vous plus précisément censé utiliser RTLD_NOW? Sinon, vous pouvez juste besoin de passer à RTLD_LAZY.
Arg! Je ne savais vraiment pas qu'. Le symbole est inscrit comme suit: U <symbol_name>.
eh bien, je ne sais pas pour certains, mais je pense qu'il est de loin préférable de comprendre pourquoi ce qui se passe et bon de remarquer. Le point est aussi l'apprentissage de toute façon.
Ce n' file <name of so file> retour? Si je le lance contre /lib/libm-2.11.1.donc, je reçois "ELF 32-bit LSB ..., dépouillé" et en cours d'exécution nm /lib/libm-2.11.1.so j'ai "pas de symboles". Mais de faire ce que @n.m. dit, j'obtiens une liste de fonctions. Ils ont d'être visible sinon, comment ferait n'importe quel programme de travail.

OriginalL'auteur Luca Carlon | 2011-12-03