2015-02-05 2 views
3

Мне нужно скомпилировать модуль, который статически связан с библиотекой lua (liblua.a) и динамически связан с библиотекой dl (libdl.so).Символы, отсутствующие после статической ссылки lua library

Я составил исходный C-файл (generic_loader.c) связывая его Д.Л. библиотека:

$ gcc -g generic_loader.c -shared -fpic -ldl -o _loader.o 

ошибок не было показано, как можно увидеть связанные библиотеки и разрешение символов:

$ ldd _loader.o 
_loader.o: 
linux-vdso.so.1 => (0x00007fff231fe000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7397949000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7397582000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f7397d6e000) 

$ nm _loader.o 
_loader.o: 
0000000000201078 B __bss_start 
0000000000201078 b completed.6972 
       w [email protected]@GLIBC_2.2.5 
00000000000008d0 t deregister_tm_clones 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
0000000000000940 t __do_global_dtors_aux 
0000000000200df0 t __do_global_dtors_aux_fini_array_entry 
0000000000201070 d __dso_handle 
0000000000200e00 d _DYNAMIC 
0000000000201078 D _edata 
0000000000201080 B _end 
0000000000000aec T _fini 
0000000000000980 t frame_dummy 
0000000000200de8 t __frame_dummy_init_array_entry 
0000000000000ba8 r __FRAME_END__ 
0000000000201000 d _GLOBAL_OFFSET_TABLE_ 
       w __gmon_start__ 
00000000000007e8 T _init 
       w _ITM_deregisterTMCloneTable 
       w _ITM_registerTMCloneTable 
0000000000200df8 d __JCR_END__ 
0000000000200df8 d __JCR_LIST__ 
       w _Jv_RegisterClasses 
00000000000009b5 T load_as_global 
0000000000000aab T luaopen_genericloader 
       U lua_pushboolean 
       U lua_pushcclosure 
       U lua_pushnil 
       U lua_pushstring 
       U lua_setfield 
       U lua_tolstring 
0000000000000900 t register_tm_clones 
0000000000201078 d __TMC_END__ 

Неразрешенные символы принадлежат библиотеке lua и должны обрабатываться на следующем шаге, поэтому, я думаю, нет никакой проблемы с этим двоичным кодом.

Так что я скомпилировал результирующий двоичный _loader.so, чтобы статически связать его с Lib Lua:

$ gcc -g -shared -fpic _loader.o /usr/local/lib/liblua.a -o genericloader.so 

Опять же, никаких ошибок, где показано на рисунке. Но когда я список символов, все ЭБ и Lua символы отсутствуют, а также load_as_global и luaopen_genericloader, обе функции, определенные в generic_loader.c:

$ldd genericloader.so 
genericloader.so: 
linux-vdso.so.1 => (0x00007fff7cdfe000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f360ad0d000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f360b2f4000) 

$ nm genericloader.so 

genericloader.so: 
0000000000201030 B __bss_start 
0000000000201030 b completed.6972 
       w [email protected]@GLIBC_2.2.5 
0000000000000530 t deregister_tm_clones 
00000000000005a0 t __do_global_dtors_aux 
0000000000200e08 t __do_global_dtors_aux_fini_array_entry 
0000000000201028 d __dso_handle 
0000000000200e18 d _DYNAMIC 
0000000000201030 D _edata 
0000000000201038 B _end 
0000000000000618 T _fini 
00000000000005e0 t frame_dummy 
0000000000200e00 t __frame_dummy_init_array_entry 
0000000000000628 r __FRAME_END__ 
0000000000201000 d _GLOBAL_OFFSET_TABLE_ 
       w __gmon_start__ 
00000000000004e0 T _init 
       w _ITM_deregisterTMCloneTable 
       w _ITM_registerTMCloneTable 
0000000000200e10 d __JCR_END__ 
0000000000200e10 d __JCR_LIST__ 
       w _Jv_RegisterClasses 
0000000000000560 t register_tm_clones 
0000000000201030 d __TMC_END__ 

я упускаю что-то, шаг в компиляции или, возможно, вариант к gcc?

Заранее спасибо.

+1

Ваш файл '_loader.o' не является обычным объектным файлом, а является файлом« shared object »(so). Отбросьте '-shared' и' -ldl' от первого заклинания компилятора и добавьте '-c', чтобы получить нормальный объектный файл. – siffiejoe

+0

Следующее предложение, я нашел ошибку при выполнении второй компиляции: gcc -g -shared -fpic _loader.o /usr/local/lib/liblua.a -o genericloader.so -ldl /usr/bin/ld: /usr/local/lib/liblua.a(lapi.o): перемещение R_X86_64_32 против 'luaO_nilobject_ 'не может использоваться при создании общего объекта; перекомпилировать с -fPIC /usr/local/lib/liblua.a: ошибка добавления символов: Плохое значение collect2: error: ld return 1 status status – ericariello

+0

Это потому, что объектные файлы в статической библиотеке были скомпилированы без '-fpic' (или '-fPIC'). – siffiejoe

ответ

0

Для смешивания динамического и статического связывания вам может потребоваться использовать -Wl,-Bstatic и -Wl,-Bdynamic, как описано в this SO answer.

+0

Tried gcc -g -shared -fpic generic_loader.c -Wl, -Bstatic -llua5.1 -Wl, -Bdynamic -ldl -o genericloader.so /usr/bin/ld:/usr/lib/gcc/x86_64- linux-gnu/4.8 /../../../ x86_64-linux-gnu/liblua5.1.a (lapi.o): перемещение R_X86_64_32 в отношении 'luaO_nilobject_ 'не может использоваться при создании общего объекта; перекомпилировать с -fPIC /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/liblua5.1.a: символы с добавлением ошибок: Плохое значение collect2: error: ld возвращен 1 статус выхода – ericariello

+0

Это означает, что вы должны добавить -fPIC в свою компиляцию liblua. – llogiq

Смежные вопросы