2012-12-17 4 views
1

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

Répondre

3

Ce _ZNSt8ios-base4InitD1Ev n'est pas un symbole C mais un C++.

$ echo _ZNSt8ios-base4InitD1Ev | c++filt 

ne donne pas la moindre idée, mais si vous remplacez le - avec une _ (une faute de frappe, peut-être?):

$ echo _ZNSt8ios_base4InitD1Ev | c++filt 
std::ios_base::Init::~Init() 

Telle est donc la destructor d'une classe interne de la bibliothèque C++ STD. Donc, vous devriez vérifier la bibliothèque libstdc++.so à la place libc.so.

Mon conseil est de simplement compiler votre programme en utilisant G ++, donc la bibliothèque C++ est correctement initialisée. Il n'est pas destiné à être chargé dynamiquement, et c'est pourquoi la faute de segmentation.

+0

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

+0

@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

+0

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

Questions connexes