Questions tagged «linker»

链接器是用于从以编译后的编程语言编写的源代码生成可执行文件的工具链的一部分。它在多个文件中获取已编译的目标代码,并从中生成一个单独的“链接”可执行文件。


4
我可以在已经编译的二进制文件中更改“ rpath”吗?
我有一个计划用于废料堆的旧可执行文件,但是还不存在。它依赖于已经从我的环境中删除的一些库,但是我在某些可以正常工作的地方有一些存根库。我想将此可执行文件指向这些存根库。是的,我可以设置LD_LIBRARY_PATH,但是许多脚本都调用了此可执行文件,许多用户也希望将其修复在一个位置。 我没有这个来源,很难得到它。我当时在想-是否可以使用支持ELF的编辑器来编辑此文件,并向rpath添加一个简单的PATH使其进入新库?这是否可能,或者一旦创建了ELF二进制文件,便将其固定在位置上并且无法移动?
92 linux  linker  elf 

5
如何指定库路径的首选项?
我正在使用g++和编译c ++程序ld。我有一个.so我想在链接期间使用的库。但是,中存在一个同名的库/usr/local/lib,并且ld正在选择该库而不是我直接指定的库。我怎样才能解决这个问题? 对于以下示例,我的库文件为/my/dir/libfoo.so.0。我尝试过的事情不起作用: 我的g ++命令是 g++ -g -Wall -o my_binary -L/my/dir -lfoo bar.cpp 添加/my/dir到我的$PATHen`变量的开头或结尾 /my/dir/libfoo.so.0作为g ++的参数添加
91 c++  linker  g++ 

1
-rpath和-L有什么区别?
gcc并ld提供了多种方法来指定库的搜索路径--rpath和-L标志。手册页没有显示这两个标志之间的差异,实际上是说每个标志都在库搜索路径中添加了一个库。但是,两个标志都做完全相同的事情似乎很奇怪。这两个选项之间有什么区别(如果有)?


5
linux动态链接程序的“无可用版本信息”错误是什么意思?
在我们的产品中,我们提供了一些Linux二进制文件,这些二进制文件可以动态链接到系统库,例如“ libpam”。在某些客户系统上,程序运行时在stderr上会出现以下错误: ./authpam: /lib/libpam.so.0: no version information available (required by authpam) 该应用程序运行良好,并从动态库执行代码。因此,这不是致命错误,实际上只是警告。 当系统安装的库缺少我们的可执行文件期望的东西时,我认为这是来自动态链接器的错误。我对动态链接过程的内部知识了解不多...搜索该主题并没有太大帮助。:( 有人知道导致此错误的原因吗?...我如何诊断原因?...以及如何更改可执行文件来避免此问题? 更新:客户已升级到最新版本的debian“测试”,并且发生了相同的错误。因此,它不是一个过时的libpam库。我想我想了解链接器在抱怨什么?如何调查根本原因等?
87 linux  linker 

2
将两个GCC编译的.o目标文件合并为第三个.o文件
一个人如何将两个由GCC编译的.o目标文件组合到第三个.o文件中? $ gcc -c a.c -o a.o $ gcc -c b.c -o b.o $ ??? a.o b.o -o c.o $ gcc c.o other.o -o executable 如果您有权访问源文件,则-combineGCC标志将在编译之前合并源文件: $ gcc -c -combine a.c b.c -o c.o 但是,这仅适用于源文件,GCC不接受.o文件作为此命令的输入。 通常,链接.o文件无法正常工作,因为您无法使用链接器的输出作为输入。结果是一个共享库,并且没有静态链接到生成的可执行文件中。 $ gcc -shared a.o b.o -o c.o $ gcc c.o other.o -o executable $ …

7
编译失败,“在创建共享库时,无法使用针对.rodata.str1.8的重定位R_X86_64_32”
我正在尝试从VPS中的makefile编译此源代码,但无法正常工作。VPS是64美分的操作系统 这是完整的错误 # make gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o /usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC …

9
内联函数中的静态变量
我有一个在头文件中声明和定义的函数。这本身就是一个问题。如果未内联该函数,则使用该标头的每个翻译单元都将获得该函数的副本,并且当它们链接在一起时,它们将被复制。我通过使函数内联来“修复”该问题,但恐怕这是一个脆弱的解决方案,因为据我所知,即使指定了“ inline”关键字,编译器也不保证内联。如果不是这样,请纠正我。 无论如何,真正的问题是,此函数内的静态变量会发生什么?我最终得到多少份?


6
C中的共享全局变量
如何创建在C中共享的全局变量?如果我将其放在头文件中,则链接器会抱怨变量已定义。是在我的一个C文件中声明变量并手动在extern所有要使用它的其他C文件的顶部放入s的唯一方法吗?听起来不理想。

4
轻松检查共享库中未解析的符号?
我正在编写一个相当大的C ++共享对象库,并且遇到了一个使调试困难的小问题: 如果我在头文件中定义函数/方法,却忘记为它创建存根(在开发过程中),因为我正在构建为共享对象库而不是可执行文件,那么编译时不会出现任何错误,告诉我忘记实现该功能。我发现问题的唯一方法是在运行时,当最终与该库链接的应用程序崩溃并出现“未定义符号”错误时。 我正在寻找一种简单的方法来检查我在编译时是否具有所需的所有符号,也许可以将它们添加到我的Makefile中。 我想出的一个解决方案是运行已编译的库,nm -C -U以获取所有未定义引用的已分解列表。问题在于,这还会列出其他库(例如GLibC)中所有引用的列表,当最终应用程序放在一起时,这些引用当然会与此库链接在一起。这将有可能使用的输出nm,以grep通过所有我的头文件,看看是否有任何名称的对应..但这似乎疯了。当然这不是一个不常见的问题,并且有更好的解决方法?


3
如何添加包含和库路径以配置/制作周期?
我需要在没有su访问权限的linux框中安装库的地方。我正在使用〜/ local [/ bin,/ lib,/ include],但是我不知道如何告诉./configure在那寻找库(特别是我正在尝试编译emacs,这需要libgif ,这不在我的发行版中)。 我尝试添加 export PATH=$PATH:~/local/bin export LD_LIBRARY_PATH=~/local/lib export C_INCLUDE_PATH=~/local/include export CPLUS_INCLUDE_PATH=~/local/include 到.bashrc,但似乎不起作用。

8
用黄金代替ld-有经验吗?
有没有人尝试使用gold代替ld? gold 有望比更快ld,因此它可以帮助加快大型C ++应用程序的测试周期,但是可以用作ld的直接替代品吗? 可以gcc/g++直接呼叫gold。吗? 是否有任何已知的错误或问题? 尽管gold已经有一段时间成为GNU binutils的一部分了,但我在网络上几乎找不到“成功案例”甚至“ Howtos”。 (更新:添加了指向黄金的链接和解释它的博客条目)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.