2010-05-03 80 views
0

我正在構建一個共享庫,我使用IBM的VisualAge C/C++編譯器動態加載(使用dlopen)到我的AIX應用程序中。不幸的是,這似乎是剝出必要符號:防止符號在IBM Visual Age中被剝離用於AIX的C/C++

 
rtld: 0712-002 fatal error: exiting. 
rtld: 0712-001 Symbol setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__ was referenced 
from module ./object/AIX-6.1-ppc/plugins/plugin.so(), but a runtime definition 
of the symbol was not found. 

兩者的共享庫和它加載針對含有VersionReporter在錯誤消息中提到的靜態庫共享庫編譯/鏈接應用程序。

要鏈接共享庫我使用這些選項:-bM:SRE -bnoentry -bexpall 要鏈接的應用程序,我使用此選項:-brtl

有沒有我可以使用一個選項爲了防止這個符號在應用程序中被剝離?我已經嘗試在IBM文檔中使用-nogc,但這會導致共享庫格式無效或應用程序無法鏈接(取決於我使用的格式)。

回答

0

我想通了。訣竅是使用一個導出列表,以便在插件中使用但未在二進制中使用的符號不會被除去。

 
# version.exp: 
setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__ 

然後鏈接應用程序使用時:-brtl -bexpfull -bE:version.exp

還有這裏的更多信息:Developing and Porting C and C++ Applications on AIX

1

是的。這並沒有真正連接到特定的語言或編譯器。例如,gcc使用相同的通用技術。 -bI:foo.exp用於告訴鏈接器foo.exp中列出的符號將來自頂部的名稱。同樣,-BE:dog.exp用於告訴鏈接器dog.exp中列出的符號已導出並可供其他人使用。

您可以看到/ bin/ldd和/ bin/dump可用於查看這些符號。