Символ не найден, но был включен при связывании

Я только что создал магическое программное обеспечение VLSI на MacOs Sierra 10.12.2. Это включает в себя создание библиотеки tclmagic.dylib. Теперь при тестировании Magic 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.o. Я также использовал nm -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`

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

Заранее спасибо, Рональд

2 ответа

Я считаю, что ответ заключается в том, что магический 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) будут работать (вероятно, сначала нужно сделать "make clean").

---Тим

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

(magic) 1 % load -lazy ./tclmagic.dylib
cannot find symbol "Tclmagic_Init": dlsym(0x10061e9f0, Tclmagic_Init): symbol not found
Другие вопросы по тегам