Linker 创建共享库时强制链接器导出已解析的符号 我正在用C++共享创建一个共享库(GCC是在x8664上运行的)。我无法将我的问题归结为一个最小的测试用例,但我遇到的问题是,我正在用一堆.o文件创建一个.so。其中一个.o文件导出一个符号(nm显示“D”),我希望从.so导出该符号。其他.o要求使用该符号(nm表示“U”)。因此,链接器使该符号在结果.so中成为本地符号(nm显示“d”)

Linker 创建共享库时强制链接器导出已解析的符号 我正在用C++共享创建一个共享库(GCC是在x8664上运行的)。我无法将我的问题归结为一个最小的测试用例,但我遇到的问题是,我正在用一堆.o文件创建一个.so。其中一个.o文件导出一个符号(nm显示“D”),我希望从.so导出该符号。其他.o要求使用该符号(nm表示“U”)。因此,链接器使该符号在结果.so中成为本地符号(nm显示“d”),linker,shared-libraries,ld,Linker,Shared Libraries,Ld,如果从命令行中删除所需的.o,.so将导出符号。因此,似乎链接器正在决定,既然其他.o用于构建。所以需要符号,它必须仅由那些.o所需,而不必真正导出 当我试图构造一个最小的测试用例时,它不能以这种方式工作;无论我是否添加了需要该符号的.o,该符号始终导出 我的完整命令行是: C++ -fNO RTTI - FNO例外-墙WAtho- Wyth-WNO Cto-Dor隐私- WNO非虚拟DRT-WCAST对齐-WNO无效偏移-WNO变量宏-迂回- Wno长-长GALFIG-2-FNO严格混叠-p

如果从命令行中删除所需的.o,.so将导出符号。因此,似乎链接器正在决定,既然其他.o用于构建。所以需要符号,它必须仅由那些.o所需,而不必真正导出

当我试图构造一个最小的测试用例时,它不能以这种方式工作;无论我是否添加了需要该符号的.o,该符号始终导出

我的完整命令行是:


C++ -fNO RTTI - FNO例外-墙WAtho- Wyth-WNO Cto-Dor隐私- WNO非虚拟DRT-WCAST对齐-WNO无效偏移-WNO变量宏-迂回- Wno长-长GALFIG-2-FNO严格混叠-pTrime-管DDECHG-DYDECHG-DDEGGGSFK -DFrG- -GSTYF2-2-FPIC -共享- Wl,-Z,DEFS - Wl,-H,libmozjs.so-o libmozjs.so jsapi.o jsarena.o jsarray.o jsatom.o jsbool.o jscntext.o jsdate.o jsdbgapi.o jsdhash.o jsdtoa.o jsemit.o jsexn.o jsun.o jsgc.o jsgcchunk.o jshash.o jsinterp.o jsinvoke.o jsiter.o jslock.o jslog2.o jsmath.o jsnativestack.o jsnum.o jsnom.o jsobj.o jsobj.o js.o jsopcode.o parse.o jsproxy.o jsprf.jso jso property.o jso jsoo jsregexp.o jsscan.o jsscope.o jsscript.o jsstr.o jstask.o jstypedarray.o jsutil.o jswrapper.o jsxdrapi.o jsxml.o prmjtime.o jsdtracef.o jstracer.o Assembler.o alloctor.o CodeAlloc.o Containers.o Fragmento.o LIR.o njconfig.o RegAlloc.o avmplus.o NativeX64.o jsbuildins.o VMPI.o CTypes.o Library.o mozzs dtrace.o-lpthread-Wl,--rpath链接,/bin-Wl、-rpath-link、/lib-Wl、-whole archive ctypes/libffi/.libs/libffi.a-Wl、-no-whole archive-L/home/sfink/moz-central/obj dtrace/dist/lib-lplds4-lplc4-lnspr4-lpthread-ldl-ldl-lm-ldl

我得到了与调用的核心命令相同的行为(我还手动删除了一些不相关的标志):


/usr/bin/ld——无需添加——eh-frame hdr——build id-m elf_x86_64——hash style=gnu-shared-o libmozjs.so/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../../../../../../lib64/usr/lib gcc/x86_64-redhat-linux/4.4/crtbeginS.o-L/usr/lib/gcc/x86-linux/4.4.4-L/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../../../../../../lib64-L/usr/lib/../lib64-L/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../。。o jsdbgapi.o jsdhash.o jsdtoa.o jsemit.o jsexn.o jsun.o jsgc.o jsgc.o jsgcchunk.o jshash.o jsinterp.o jsinvoke.o jsiter.o jslock.o jslog2.o jsmath.o jsnativestack.o jsnum.o jsobj.o jsopcode.o jsparse.o jsproxy.o jsf.o jsf.o jspropertycache.o jspryte.o jso jso jso jso范围o jsscript.o jsstr.o jstask.o jstypedarray.o jsutil.o jswrapper.o jsxdrapi.o jsxml.o prmjtime.o jsdtracef.o jstracer.o Assembler.o alloc.o Containers.o Fragmento.o LIR.o njconfig.o RegAlloc.o avmplus.o NativeX64.o jsbuiltins.o VMPI.o mozjs dtrace.o-lnspr4-lstdc++-lm-lgcc\u s-lpthread-lc-lgcc/usr/lib/gcc/x86_64-redhat-linux/4.4.4/crtrends.o/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../../../../../lib64/crtn.o


更新:可能更重要的是,这些符号位于不同的部分,并且具有隐藏的可见性。使用objcopy将它们设置为全局并没有帮助。我不知道规则是什么,哪些部分用来做什么。

听起来你可能在ld中遇到了一些错误。你能试试最新版本的ld(2.20.1)吗?ld--版本是:GNU ld版本2.20.51.0.2-20.fc13 20091009。我将尝试Virgin2.20.1,看看它是否重要。也许是一块软呢帽打破了这一切。我认为这不是预期的行为?Linkerz很难。不,与标准2.20.1的行为相同。听起来你可能在ld中遇到了一些错误。你能试试最新版本的ld(2.20.1)吗?ld--版本是:GNU ld版本2.20.51.0.2-20.fc13 20091009。我将尝试Virgin2.20.1,看看它是否重要。也许是一块软呢帽打破了这一切。我认为这不是预期的行为?Linkerz很难。不,与标准2.20.1的行为相同。