2017-01-23 12 views
-1

Я только что создал волшебное программное обеспечение VLSI на MacOs Sierra 10.12.2. Сюда входит создание библиотеки tclmagic.dylib. Теперь при тестировании Волшебного Exec я получаю:Символ не найден, но был включен во время ссылки

magic 
dyld: lazy symbol binding failed: Symbol not found: _HashInit 
    Referenced from: /usr/local/lib/magic/tcl/tclmagic.dylib 
    Expected in: flat namespace` 

Я искал и нашел функцию HashInit внутри библиотеки утилиты, которая включена во время связывания:

gcc -g -I/usr/X11/include -I/Library/Frameworks/Tk.framework/Versions/8.6/Headers -I/Library/Frameworks/Tcl.framework/Versions/8.6/Headers -fno-common -Wimplicit-int -fPIC -I/Library/Frameworks/Tk.framework/Versions/8.6/Headers -I/Library/Frameworks/Tcl.framework/Versions/8.6/Headers -I. -I.. -o tclmagic.dylib -dynamiclib -flat_namespace -undefined suppress -noprebind \ 
    ../cmwind/libcmwind.o ../commands/libcommands.o ../database/libdatabase.o ../dbwind/libdbwind.o ../drc/libdrc.o ../debug/libdebug.o ../extract/libextract.o ../graphics/libgraphics.o ../select/libselect.o ../textio/libtextio.o ../tiles/libtiles.o ../windows/libwindows.o ../wiring/libwiring.o ../resis/libresis.o ../sim/libsim.o ../netmenu/libnetmenu.o ../plow/libplow.o ../utils/libutils.o ../ext2sim/libext2sim.o ../ext2spice/libext2spice.o ../calma/libcalma.o ../cif/libcif.o ../plot/libplot.o ../lef/liblef.o ../extflat/libextflat.o ../garouter/libgarouter.o ../mzrouter/libmzrouter.o ../router/librouter.o  ../irouter/libirouter.o ../grouter/libgrouter.o  ../gcr/libgcr.o ../tcltk/libtcltk.o -lc -lX11 -lGL -lGLU -lm -L/usr/X11/lib -lm 

Функция HashInit находится внутри ../utils/libutils .о. Я также использовал нм -gu на двух бинарных файлов и символ найден:

nm -gU utils/libutils.o | grep HashInit 
0000000000002880 T _HashInit 
00000000000028c0 T _HashInitClient 

nm -gU magic/tclmagic.dylib| grep HashInit 
000000000011ec70 T _HashInit 
000000000011ecb0 T _HashInitClient 

Я теперь попробовал отдельную команду связующую и выливать отображение символов файла:

ld -o tclmagic.dylib -dylib -flat_namespace -undefined suppress -noprebind   ../cmwind/libcmwind.o ../commands/libcommands.o ../database/libdatabase.o ../dbwind/libdbwind.o ../drc/libdrc.o ../debug/libdebug.o ../extract/libextract.o ../graphics/libgraphics.o ../select/libselect.o ../textio/libtextio.o ../tiles/libtiles.o ../windows/libwindows.o ../wiring/libwiring.o ../resis/libresis.o ../sim/libsim.o ../netmenu/libnetmenu.o ../plow/libplow.o ../utils/libutils.o ../ext2sim/libext2sim.o ../ext2spice/libext2spice.o ../calma/libcalma.o ../cif/libcif.o ../plot/libplot.o ../lef/liblef.o ../extflat/libextflat.o ../garouter/libgarouter.o  ../mzrouter/libmzrouter.o ../router/librouter.o  ../irouter/libirouter.o ../grouter/libgrouter.o  ../gcr/libgcr.o ../tcltk/libtcltk.o -lc -lX11 -lGL -lGLU -lm -L/usr/X11/lib -lm -macosx_version_min 10.12 -all_load -why_load -map debug_map 
ld: warning: option -noprebind is obsolete and being ignored 

Опять же, я вижу символ доступен:

cat debug_map | grep HashInit 
0x0011F390 0x00000040 [ 18] _HashInit 
0x0011F3D0 0x00000150 [ 18] _HashInitClient 
0x001DADFE 0x00000006 [ 18] _HashInit 
0x001DAE04 0x00000006 [ 18] _HashInitClient 
0x001DF2B8 0x0000000A [ 18] _HashInit 
0x001DF2C2 0x0000000A [ 18] _HashInitClient 
0x0020C1D8 0x00000008 [ 18] _HashInit 
0x0020C1E0 0x00000008 [ 18] _HashInitClient` 

Btw, я видел подобные вопросы here и here, но я считаю их сценарий может быть slightl y по-разному, поскольку одна была причиной ошибки cmake, а другая была обработана с помощью DYLD_INSERT_LIBRARIES, что не влияет на мой случай.

Спасибо заранее, Ronald

ответ

0

кажется, что добавление -exported_symbol_list symbol.list к связующей команде получит меня передать вопрос (symbol.list содержит 1 экспортируемых символ каждую строку). Тем не менее, я все еще получаю следующее (ниже команда запускает в tclsh):

(magic) 1 % load -lazy ./tclmagic.dylib 
cannot find symbol "Tclmagic_Init": dlsym(0x10061e9f0, Tclmagic_Init): symbol not found 
0

Я считаю, что ответ в том, что магия Makefile не используя «окурки» библиотеки Tcl. Я успешно конвертировал netgen для использования заглушек, просто нужно сделать то же самое для магии. Использование «-lazy» было, действительно, ленивым способом обойти проблему, но использование библиотек заглушек - правильный путь.

В общей процедуре файл defs.mak должен определять LIB_SPECS с «-ltkstub8.6» и «-ltclstub8.6» вместо «-ltk8.6» и «-ltcl8.6». Исправление более сложное для использования с «configure», поскольку defs.mak происходит от defs.mak.in. Но я думаю, что быстрое изменение LIB_SPECS в defs.mak и перестроение (без запуска configure) будут работать (возможно, сначала нужно сделать «чистым»).

--- Tim

+0

Hi Tim! Большое спасибо за ответ ... (и для поддержания Magic & qflow btw!) ... В какой-то момент я выяснил, что библиотеки-заглушки должны быть добавлены и что я должен также добавить -DUSE_TCL_STUBS и -DUSE_TK_STUBS. Однако я все еще получаю сообщение dlsym, жалующееся на Tclmagic_Init ... Теперь у меня заканчиваются идеи ... С уважением, Ronald – 20Mhz