Linux / Cross Compiling - C - Programmation
Marsh Posté le 17-08-2009 à 11:28:59
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 |
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$ 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$ 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 |
Marsh Posté le 17-08-2009 à 12:55:34
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.
Marsh Posté le 17-08-2009 à 13:22:27
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 |
... 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 |
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 |
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.
Marsh Posté le 18-08-2009 à 00:11:11
Tu peux faire un "man ld" et tu auras les explications que tu recherches
Marsh Posté le 15-08-2009 à 15:33:11
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 :
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$
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