Linker 未找到符号,但在链接过程中包含该符号
我刚刚在MacOs Sierra 10.12.2上构建了magic VLSI软件。这包括构建tclmagic.dylib库。现在,当测试Magic Exec时,我得到:Linker 未找到符号,但在链接过程中包含该符号,linker,dylib,undefined-symbol,nm,Linker,Dylib,Undefined Symbol,Nm,我刚刚在MacOs Sierra 10.12.2上构建了magic VLSI软件。这包括构建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` 我在链接期间
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_库解决的,这对我的案例没有影响
提前感谢,,
Ronald似乎将
-exported\u symbol\u list symbol.list
添加到链接命令将使我通过该问题(symbol.list每行包含一个导出符号)。但是,我仍然得到以下信息(以下命令在tclsh中运行):
我相信答案是magicmakefile没有使用Tcl“stubs”库。我成功地将netgen转换为使用存根,只需对magic执行同样的操作。使用“-lazy”确实是解决这个问题的懒惰方法,但是使用stubs库是正确的方法 作为一般程序,文件defs.mak需要使用“-ltkstub8.6”和“-ltclstub8.6”来定义LIB_规范,而不是“-ltk8.6”和“-ltcl8.6”。由于defs.mak是从defs.mak.in派生而来的,因此与“configure”一起使用的修复程序更为复杂。但我认为快速更改defs.mak中的LIB_规范和重建(不运行configure)将起作用(可能必须先执行“makeclean”)
---蒂姆嗨,蒂姆!非常感谢您的回复。。。(为了维护Magic&qflow顺便说一下!)在某个时候,我发现应该添加存根库,并且还应该添加-DUSE_TCL_存根和-DUSE_TK_存根定义。但是我仍然收到dlsym消息,抱怨Tclmagic_Init。。。现在我的点子都快用完了。。。你好,罗纳德
(magic) 1 % load -lazy ./tclmagic.dylib
cannot find symbol "Tclmagic_Init": dlsym(0x10061e9f0, Tclmagic_Init): symbol not found