【问题标题】:Symbol not found but was included during linking未找到符号但在链接期间包含
【发布时间】:2017-01-23 00:35:44
【问题描述】:

我刚刚在 MacOs Sierra 10.12.2 上构建了神奇的 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`

我在链接过程中包含的实用程序库中搜索并找到了 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`

顺便说一句,我见过类似的问题 herehere,但我相信他们的情况可能略有不同,因为一个是由 cmake 错误引起的,另一个是通过使用 DYLD_INSERT_LIBRARIES 解决的,它没有对我的案子有影响。

提前致谢, 罗纳德

【问题讨论】:

    标签: linker dylib undefined-symbol nm


    【解决方案1】:

    似乎将-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
    

    【讨论】:

      【解决方案2】:

      我相信答案是神奇的 Makefile 没有使用 Tcl “存根”库。我成功地将 netgen 转换为使用存根,只需要对魔法做同样的事情。使用“-lazy”确实是解决问题的懒惰方法,但使用存根库是正确的方法。

      作为一般程序,文件 defs.mak 需要使用“-ltkstub8.6”和“-ltclstub8.6”而不是“-ltk8.6”和“-ltcl8.6”来定义 LIB_SPECS。由于 defs.mak 是从 defs.mak.in 派生的,因此与“配置”一起使用该修复程序更加复杂。但我认为在 defs.mak 中快速更改 LIB_SPECS 并重新构建(不运行配置)将起作用(可能必须先执行“make clean”)。

      ---蒂姆

      【讨论】:

      • 嗨蒂姆!非常感谢您的回复...(以及维护 Magic & qflow btw!)...在某些时候,我发现应该添加存根库,并且我还应该添加 -DUSE_TCL_STUBS 和 -DUSE_TK_STUBS 定义。但是我仍然收到抱怨 Tclmagic_Init 的 dlsym 消息......现在我的想法已经用完了......问候,罗纳德
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2012-06-22
      相关资源
      最近更新 更多