2017-01-23 59 views
-1

我剛剛在MacOs Sierra 10.12.2上構建了魔術VLSI軟件。這包括構建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的.o。 我還使用納米-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,但我相信他們的情況可能是slightl y不同,因爲cmake錯誤導致了一個錯誤,另一個錯誤使用了DYLD_INSERT_LIBRARIES,這對我的情況沒有影響。

由於提前, 羅納德

回答

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需要用「-ltkstub8.6」和「-ltclstub8.6」而不是「-ltk8.6」和「-ltcl8.6」來定義LIB_SPECS。由於defs.mak派生自defs.mak.in,所以修復與「configure」一起使用會更復雜。但我認爲在defs.mak中快速更改LIB_SPECS並重建(不運行配置)將會起作用(可能必須首先執行「make clean」)。

--- Tim

+0

Hi Tim! 非常感謝回覆...(並保持Magic&qflow btw!) ...在某些時候,我發現應該添加存根庫,並且還應該添加-DUSE_TCL_STUBS和-DUSE_TK_STUBS定義。不過,我仍然得到dlsym消息抱怨Tclmagic_Init ...現在我用盡想法... Regards, Ronald – 20Mhz