Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1519 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Linux / Cross Compiling

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Linux / Cross Compiling

n°1915401
Olivier51
Posté le 15-08-2009 à 15:33:11  profilanswer
 

Petit probleme de cross compiling ... La target est dans /var/local/myimage/. C'est du x86 également, mais une distribution différente.
 
Deux fichiers C :

Code :
  1. #include <dlfcn.h>
  2. void* myfunc() {
  3.   return dlopen("mylib.so",RTLD_LAZY);
  4. }


olivier@olivier-linux:/tmp$ gcc -shared -Wl,-soname=libmylib.so -o libmylib.so test_lib.c -L/var/local/myimage/usr/lib -ldl
olivier@olivier-linux:/tmp$ nm libmylib.so
00001f10 a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
00001f00 d __CTOR_END__
00001efc d __CTOR_LIST__
00001f08 d __DTOR_END__
00001f04 d __DTOR_LIST__
00000500 r __FRAME_END__
00001f0c d __JCR_END__
00001f0c d __JCR_LIST__
0000200c A __bss_start
         w __cxa_finalize@@GLIBC_2.1.3
         U __dlopen
000004a0 t __do_global_ctors_aux
00000390 t __do_global_dtors_aux
00002008 d __dso_handle
00000000 n __evoke_link_warning_dlopen
         w __gmon_start__
00000447 t __i686.get_pc_thunk.bx
0000200c A _edata
00002014 A _end
000004d8 T _fini
00000324 T _init
0000200c b completed.6635
00000470 T dlopen
00002010 b dtor_idx.6637
00000410 t frame_dummy
0000044c T myfunc
olivier@olivier-linux:/tmp$


 

Code :
  1. void* myfunc();
  2. int main() {
  3.   void *hDl = myfunc();
  4.   return 0;
  5. }


olivier@olivier-linux:/tmp$ gcc test_dl.c -o test_dl -L/tmp -lmylib
/tmp/libmylib.so: undefined reference to `__dlopen'
collect2: ld returned 1 exit status
olivier@olivier-linux:/tmp$ gcc test_dl.c -o test_dl -Xlinker -rpath-link /var/local/myimage/usr/lib -L/tmp -lmylib
/tmp/libmylib.so: undefined reference to `__dlopen'
collect2: ld returned 1 exit status
olivier@olivier-linux:/tmp$


 

olivier@olivier-linux:/tmp$ nm /var/local/myimage/usr/lib/libc.a | grep dlopen
         U __libc_dlopen_mode
         U __libc_dlopen_mode
nm: old_atexit.o: no symbols
nm: udiv_qrnnd.o: no symbols
nm: mp_clz_tab.o: no symbols
sdlopen.o:
00000000 T __dlopen
00000050 t dlopen_doit
         U __dlopen
nm: getopt_init.o: no symbols
nm: init-posix.o: no symbols
nm: lseek64.o: no symbols
nm: oldgetrlimit64.o: no symbols
nm: libc_multiple_threads.o: no symbols
         U __libc_dlopen_mode
         U __libc_dlopen_mode
nm: getutmpx.o: no symbols
00000200 T __libc_dlopen_mode
00000250 t do_dlopen
olivier@olivier-linux:/tmp$


Message édité par Olivier51 le 15-08-2009 à 16:30:43
mood
Publicité
Posté le 15-08-2009 à 15:33:11  profilanswer
 

n°1915558
Olivier51
Posté le 17-08-2009 à 01:42:34  profilanswer
 

[:fight]

n°1915663
Olivier51
Posté le 17-08-2009 à 11:28:59  profilanswer
 

Probleme resolu ... Remplacer "-Lmydir" par "-Xlinker -rpath-link mydir", mouais pourquoi pas ...
 
Si quelqu'un a un peu plus de definition sur -Lmydir que celle du man, je la prendrai avec plaisir :

-Ldir
    Add directory dir to the list of directories to be searched for -l.


 

olivier@olivier-linux:/tmp$ gcc -shared -Wl,-soname=libmylib.so -o libmylib.so test_lib.c -L/var/local/myimage/usr/lib -ldl
olivier@olivier-linux:/tmp$ ldd libmylib.so  
 linux-gate.so.1 =>  (0xb7f2b000)
 libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7daf000)
 /lib/ld-linux.so.2 (0xb7f2c000)


 

olivier@olivier-linux:/tmp$ gcc -shared -Wl,-soname=libmylib.so -o libmylib.so test_lib.c -Xlinker -rpath-link /var/local/myimage/usr/lib -ldl
olivier@olivier-linux:/tmp$ ldd libmylib.so  
 linux-gate.so.1 =>  (0xb7fc0000)
 libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fa3000)
 libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e40000)
 /lib/ld-linux.so.2 (0xb7fc1000)


 

olivier@olivier-linux:/tmp$ gcc -shared -Wl,-soname=libmylib.so -o libmylib.so test_lib.c -Xlinker -rpath-link /var/local/myimage/usr/lib -L/var/local/myimage/usr/lib -ldl
olivier@olivier-linux:/tmp$ ldd libmylib.so  
 linux-gate.so.1 =>  (0xb804f000)
 libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7ed3000)
 /lib/ld-linux.so.2 (0xb8050000)


Message édité par Olivier51 le 17-08-2009 à 11:30:14
n°1915697
Elmoricq
Modérateur
Posté le 17-08-2009 à 12:55:34  profilanswer
 

L'option -L permet simplement d'ajouter un nom de répertoire dans la liste de ceux contenant les bibliothèques à linker.
Cette option ne fonctionne que pour les options -l qui suivent, pour celles qui précèdent l'option est ignorée.

 

Par contre j'pige pas d'où vient ton souci.


Message édité par Elmoricq le 17-08-2009 à 12:56:53
n°1915711
Olivier51
Posté le 17-08-2009 à 13:22:27  profilanswer
 

Si je linke avec les arguments "-L/var/local/myimage/usr/lib -ldl" (je souhaite "linker" mon appli avec la lib libdl.so de mon environement /var/local/myimage/). Il semblerait que le lien n'est pas fait (comme le montre le ldd libmylib.so).
 

olivier@olivier-linux:/tmp$ gcc -shared -Wl,-soname=libmylib.so -o libmylib.so test_lib.c -L/var/local/myimage/usr/lib -ldl
olivier@olivier-linux:/tmp$ ldd libmylib.so  
 linux-gate.so.1 =>  (0xb7f2b000)
 libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7daf000)
 /lib/ld-linux.so.2 (0xb7f2c000)


 
... Si tu essayes avec seulement "-ldl". Dans ce cas-la, le linker va utiliser /usr/lib/libdl.so.

olivier@olivier-linux:/tmp$ gcc -shared -Wl,-soname=libmylib.so -o libmylib.so test_lib.c -ldl
olivier@olivier-linux:/tmp$ ldd libmylib.so  
 linux-gate.so.1 =>  (0xb7fe0000)
 libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fc3000)
 libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e60000)
 /lib/ld-linux.so.2 (0xb7fe1000)


 
Si je remplace "-L/var/local/myimage/usr/lib" par "-Xlinker -rpath-link /var/local/myimage/usr/lib" ... tout se passe bien :

olivier@olivier-linux:/tmp$ gcc -shared -Wl,-soname=libmylib.so -o libmylib.so test_lib.c -Xlinker -rpath-link /var/local/myimage/usr/lib -ldl
olivier@olivier-linux:/tmp$ ldd libmylib.so  
 linux-gate.so.1 =>  (0xb7fc0000)
 libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fa3000)
 libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7e40000)
 /lib/ld-linux.so.2 (0xb7fc1000)


 
La conclusion de l'experience pourrait etre qu'il ne faut pas utiliser "-Ldir" lorsqu'on veut faire du cross-compiling, mais j'aimerais trouver une reponse un peu plus theorique.

n°1916013
ITM
Avatar peint à la main
Posté le 18-08-2009 à 00:11:11  profilanswer
 

Tu peux faire un "man ld" et tu auras les explications que tu recherches :hello:


---------------
iteme.free.fr | Mon feedback

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Linux / Cross Compiling

 

Sujets relatifs
[C++] Cherche lib + howto pour utiliser le pilote wifi (linux)socket pas thread safe sous linux ? si en fait (resolu)
[Resolu]Adaptation programme Windows vers LinuxRSH depuis linux vers Windows 2003 ...
lister contenu dossier linux avec QtProgramme c sous linux
[C] Probléme de récupération des données à travers ttyS (LINUX)Problème pour compiler un projet sous Linux
Retour chariot : OSX, Linux , CR, CR LF...Javascript : pb avec des Frames (résolu)
Plus de sujets relatifs à : Linux / Cross Compiling


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR