问题标签 [ld]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linker - 创建共享库时强制链接器导出已解析的符号
我正在使用 c++ -shared(它是在 x86_64 上运行的 gcc)创建一个共享库。我无法将我的问题简化为最小的测试用例,但我遇到的问题是我正在从一堆 .o 文件中创建一个 .so 。其中一个 .o 文件导出了我想从 .so 导出的符号(nm 显示“D”)。其他 .o 需要该符号(nm 显示“U”)。结果,链接器使该符号在生成的 .so 中成为本地符号(nm 显示“d”)。
如果我从命令行中删除需要的 .o,则 .so会导出该符号。因此,似乎链接器正在决定,由于其他 .o 用于构建 .so 需要该符号,因此它只能由那些 .o 需要,并且不需要真正导出。
当我尝试构建一个最小的测试用例时,它不会这样工作;无论我是否添加需要它的 .o ,该符号总是被导出。
我的完整命令行是:
c++ -fno-rtti -fno-exceptions -Wall -Wpointer-arith -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wcast-align -Wno-invalid-offsetof -Wno-variadic-macros -pedantic -Wno-long-long -gdwarf-2 -fno-strict-aliasing -pthread -pipe -DDEBUG -D_DEBUG -DDEBUG_sfink -DTRACING -gdwarf-2 -fPIC -shared -Wl,-z,defs -Wl,-h,libmozjs.so -o libmozjs.so jsapi.o jsarena.o jsarray.o jsatom.o jsbool.o jscntxt.o jsdate.o jsdbgapi.o jsdhash.o jsdtoa.o jsemit.o jsexn.o jsfun.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 json.o jsopcode.o jsparse.o jsproxy.o jsprf.o jspropertycache.o jspropertytree.o 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 Allocator.o CodeAlloc.o Containers.o Fragmento.o LIR.o njconfig.o RegAlloc.o avmplus.o NativeX64.o jsbuiltins.o VMPI.o CTypes.o Library.o mozjs-dtrace.o -lpthread -Wl,-rpath-link,/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 -lm -ldl
我使用它调用的核心命令得到相同的行为(我还手动删除了一些不相关的标志):
/usr/bin/ld --no-add-needed --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/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.4/crtbeginS.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.4 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.4 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../.. jsapi.o jsarena.o jsarray.o jsatom.o jsbool.o jscntxt.o jsdate.o jsdbgapi.o jsdhash.o jsdtoa.o jsemit.o jsexn.o jsfun.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 json.o jsopcode.o jsparse.o jsproxy.o jsprf.o jspropertycache.o jspropertytree.o 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 Allocator.o CodeAlloc.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_s -lpthread -lc -lgcc_s /usr/lib/gcc/x86_64-redhat-linux/4.4.4/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/4.4.4/../../../../lib64/crtn.o
更新:可能更重要的是,这些符号位于不同的部分,并且具有隐藏的可见性。使用 objcopy 使它们全局化并没有帮助。我不知道哪些部分用于什么的规则是什么。
c++ - AIX 6.1 链接器错误
我正在尝试在 AIX 上编译我的应用程序。它在 Linux、Solaris x86 和 Windows 上构建良好,但这是我们第一次尝试在 AIX 上构建。我已经设法将所有库链接在一起,我收到错误消息:链接... ld:0711-101 致命错误:在例程 get_RLD 中分配 96864 字节失败。没有足够的可用内存。请检查您的 ulimit 或分页空间或使用本地问题报告程序。collect2: ld 返回 12 退出状态
我将页面空间增加了 1GB - 没有区别我增加了 ulimit 值 - 没有区别我尝试将 maxdata 标志传递给链接器 - 没有区别
还有什么我应该尝试的吗?
我不确定如何确定是哪个库导致了问题。我们正在尝试静态链接 boost_date_time、xerces-c 和 libz 以及 50 个内部库。我无法更改为动态链接,也无法对系统的结构进行太多更改,因此我正在寻找配置或参数的想法来尝试 ld。
c - gcc 链接器错误:找不到符号的版本节点
我正在尝试构建一个共享库,但出现以下错误:
libavformat.so:未找到符号 av_dup_packet@LIBAVFORMAT_52 的版本节点
ld:未能设置动态部分大小:错误值
有谁知道这个错误是什么意思?主机是 i586-linux 目标是 arm-linux
编辑:已解决,见评论
gcc - Fedora 8/EC2:ld 找不到库
我试图让 gcc 在 Fedora 8 的 Amazon EC2 映像上工作,但我遇到了库问题。ld 没有找到 -lz -lm -lbz2。
我尝试将 -L /lib 和 -L /usr/lib 添加到 gcc 的参数中,但它仍然无法正常工作。
我错过了什么?
c - gcc 在使用 fmod() 时出错
fmod 的示例代码:
编译:
我明白了
/tmp/ccztJO01.o:在函数“主”中:
main.c:(.text+0x4d): 未定义对“fmod”的引用
collect2: ld 返回 1 个退出状态
然后我在谷歌上找到了这个:
我为什么要使用-lm
,它到底是什么?从哪里可以得到更多关于 gcc 的详细信息?
c++ - GNU ld 找不到那里的库
我在这里玩弄的包是相当未知的,但问题是相当普遍的。基本上,我正在尝试用 C++ 扩展编译 Python 模块(称为 rql)。该扩展使用名为 gecode 的外部框架,其中包含多个库。我编译了gecode并在本地安装。现在,让输出说明一切:
gcc - 如何在与 gcc 的链接中绕过“多个定义的符号”
我正在使用具有 gcc 2.95.3 的旧系统,我必须链接两个对象,尽管它们彼此无关,但它们每个都有类似命名的方法。我不能重命名它们中的任何一个,但我希望有一种方法可以构建它们,以免链接器抱怨。它所抱怨的方法都是由对象中的类在内部调用的。我能做些什么?
unix - ld 找不到要链接的库
以下是描述我的问题的示例:
path1和path2都是相对路径,根据ld的pwd可以找到库A,那为什么ld输出这个错误信息呢?
谁能给我一些建议来调试这个问题?
我想念一些,在一个名为 rt 的库之前有一个“-static”。
根据您的建议,我尝试让 gcc 驱动 ld 进行链接过程。gcc 傲博 -mabi=64 -static -lrt -Xlinker -T -Xlinker ld.script -W1,-rpath,/usr/local/lib -lmemdbg -o target 不行。
然后我删除了“-static”选项,以及-lpthread之后的另一个动态库(因为rt依赖于我删除“-static”时发现的pthread)
gcc 傲博 -mabi=64 -lrt -lpthread -Xlinker -T -Xlinker ld.script -W1,-rpath,/usr/local/lib -lmemdbg -o target 并且这次对象链接成功了。
然后我试图通过将“-v”传递给 gcc 来弄清楚为什么“-static”命令不起作用。出现了一些“-L”选项,并在搜索列表中找到了一个名为 librt.a 的库。
我真的很困惑。gcc的版本是4.3
haskell - 符号 __module_registered 错误的重复定义
我从 GHCi 收到一条关于“符号 __module_registered 的重复定义”的错误消息,如下所示:
如何解决这个问题?