Je suis en train de compiler un programme pour un système embarqué. Le programme utilise une bibliothèque partagée, que j'ouvre comme ça.Impossible de résoudre le symbole
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h> //needed for dynamic linking
void *FunctionLib; //Handle to shared lib file
int (*Function)(); //Pointer to loaded routine
const char *dlError; //Pointer to error string
int main(argc, argv)
{
int rc; //return codes
printf("start...\n");
//Open Dynamic Loadable Libary with absolute path
FunctionLib = dlopen("/lalabu/sharedLib.so",RTLD_LAZY | RTLD_GLOBAL);
dlError = dlerror();
printf("Open sharedLib.so returns: %s \n", dlError);
if(dlError) exit(1);
//Find function
Function = dlsym(FunctionLib, "getSomething");
dlError = dlerror();
printf("Find symbol getSomething returns: %s \n", dlError);
if(dlError) exit(1);
...
Je compile le code avec la commande suivante
mips-linux-uclibc-gcc -Wall -ldl ./dynamic_linking.c -o /dynamic_linking
qui fonctionne sans aucun avertissement et d'autres choses.
Si je vais maintenant essayer d'exécuter ce code sur mon appareil, je reçois l'erreur suivante:
# ./dynamic_linking
start...
Open sharedLib.so returns: (null)
Find symbol getSomething returns: Unable to resolve symbol
./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev'
Si je regarde avec l'IDA qui fonctionne sharedLib.so veut importer, je vois la fonction (ou symbole ?) '_ZNSt8ios_base4InitD1Ev' et où il devrait être (libc.so.0).
Si je jette un oeil à libc.so.0, encore une fois avec IDA, je ne vois pas une fonction appelée comme ceci. Aussi rien de tel que ios_base, ios ou base.
J'ai essayé déjà diverses combinaisons de drapeau avec dlopen() qui a donné lieu toujours dans l'erreur ci-dessus, sauf quand je l'utilise RTLD_NOW au lieu de RTLD_LAZY je reçois
Segmentation fault (core dumped)
au lieu de
./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev'
De plus j'ai essayé une peu d'options de liaison gcc comme rdynamic, toujours avec le même résultat.
En outre, j'ai essayé d'utiliser une bibliothèque partagée qui n'utilise pas _ZNSt8ios_base4InitD1Ev, le 'libc.so.0' pour vérifier si mon code-c fonctionne. J'ai seulement changé le nom et le chemin absolu et ai supprimé la partie de fonction de recherche. Cela a fonctionné sans erreurs.
Comme vous pouvez le constater d'après mon article, je viens de commencer à compiler et à utiliser des bibliothèques dynamiques, alors peut-être que ma faute est ailleurs. D'ailleurs, je ne suis pas sûr si je comprends même où le problème est, ainsi n'importe quels conseils sont bienvenus. Si vous avez besoin de plus amples informations, je serais heureux de vous les donner.
Salutations, Pingu
Merci pour la réponse, j'ai compilé le programme avec mips-linux-uclibc-cpp -Wall ./dynamic_linking.c -o ./dynamic_linking et il compilé toute erreur. Je peux vérifier demain si cela fonctionne sur l'appareil, je vais donner des commentaires. Le - au lieu du _ était en effet une faute de frappe, désolé. – Pingu
@Pingu: Mais attention! 'cpp' n'est pas le nom du compilateur GCC C++ (qui serait' g ++ 'ou' C++ '.) C'est le nom du précompilateur C. Il serait amusant que le programme' dynamic_linking' soit la sortie du précompilateur ! – rodrigo
Je n'ai pas de compilateur gcc C++ pour mon périphérique, mais en lisant ce post, http: // stackoverflow.com/questions/6626363/Pourquoi-utiliser-g-au lieu-de-gcc-compiler-cc-fichiers Je pense qu'il est possible de compiler le code avec gcc en utilisant les bibliothèques std C++. Je vais essayer de comprendre. – Pingu