ld相关内容

-rpath 和 -L 有什么区别?

gcc 和 ld 提供了多种指定库搜索路径的方法——其中包括 -rpath 和 -L 标志.联机帮助页显示这两个标志之间没有区别,实际上是说每个标志都将一个库添加到库搜索路径中.然而,这两个标志完全做同样的事情似乎很奇怪.这两个选项之间有什么区别(如果有)? 解决方案 您必须阅读一些过时的联机帮助页副本(已添加重点): -rpath=dir 将目录添加到运行时库搜索路径. ..
发布时间:2021-12-18 22:47:57 其他开发

GNU gcc/ld - 用在同一个目标文件中定义的调用者和被调用者包装对符号的调用

澄清一下,我的问题是指包装/拦截从一个函数/符号到另一个函数/符号的调用当调用者和被调用者在 GCC 编译器和链接器的同一编译单元中定义时. 我有类似以下的情况: /* foo.c */无效 foo(void){/* ...一些东西*/酒吧();}空栏(空){/* ...一些其他的东西*/} 我想包装对这些函数的调用,我可以用 ld 的 --wrap 选项(然后我实现了 __wrap_f ..
发布时间:2021-12-18 22:40:45 其他开发

我不明白 -Wl,-rpath -Wl,

为方便起见,我在下面添加了相关的联机帮助页. 我的(错误)理解首先:如果我需要用 , 分隔选项,那意味着第二个 -Wl 不是另一个选项,因为它在 之前>, 表示它是 -rpath 选项的参数. 我不明白 -rpath 怎么会有 -Wl,. 参数! 我认为有意义的是: -Wl,-rpath . 这应该使用当前目录参数调用 -rpath 链接器选项. man gcc: ..
发布时间:2021-12-18 22:30:02 其他开发

--start-group 和 --end-group 命令行选项是什么?

这些命令行选项的目的是什么?请帮忙解读以下命令行的含义: -Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib 显然它与链接有关,但 GNU 手册没有说明分组的确切含义. 解决方案 用于解决几个库之间的循环依赖(列在 -( 和 -) 之间). 引用 为什么库链接的顺序有时会导致 GC ..
发布时间:2021-12-18 22:29:26 其他开发

LD_LIBRARY_PATH 与 LIBRARY_PATH

我正在构建一个简单的 C++ 程序,我想暂时用更新版本的系统提供的共享库替换它,以进行开发和测试. 我尝试设置 LD_LIBRARY_PATH 变量,但链接器 (ld) 失败: /usr/bin/ld: 找不到 -lyaml-cpp 我希望它可以工作,因为根据 ld 手册页: 链接器使用以下搜索定位所需共享的路径库:...对于本机链接器,环境变量的内容“LD_LIBRARY ..
发布时间:2021-12-18 22:27:51 其他开发

对于小程序,链接后的最小可执行文件大小现在比 2 年前大 10 倍?

对于大学课程,我喜欢比较使用 gcc/clang 与汇编编写和编译的功能相似程序的代码大小.在重新评估如何进一步缩小某些可执行文件的大小的过程中,当我 2 年前组装/链接的完全相同的汇编代码在重新构建后现在已经增长了 10 倍时,我简直不敢相信自己的眼睛(这适用于多个程序,不仅是 helloworld): $ makeas -32 -o helloworld-asm-2020.o hellowo ..
发布时间:2021-12-18 09:04:59 服务器开发

为什么一个 ELF 可执行文件可以有 4 个 LOAD 段?

有一个远程 64 位 *nix 服务器可以编译用户提供的代码(应该用 Rust 编写,但我认为这无关紧要,因为它使用的是 LLVM).我不知道它使用哪个编译器/链接器标志,但编译后的 ELF 可执行文件看起来很奇怪 - 它有 4 个 LOAD 段: $ readelf -e 可执行文件...程序标题:类型 Offset VirtAddr PhysAddrFileSiz MemSiz 标志对齐.. ..
发布时间:2021-12-14 23:39:54 服务器开发

链接错误 - gcc -lm

好吧,我认为我的问题有点有趣,我想了解我的 Ubuntu 机器中发生了什么. 我编译并使用 gcc -lm -o useless useless.c 链接了以下无用的代码: /*文件无用.c*/#include #include int main(){int 样本 = (int)(0.75 * 32768.0 * sin(2 * 3.14 * 440 * ((float) ..
发布时间:2021-12-12 12:32:11 其他开发

如何打印 ld(linker) 搜索路径

按搜索顺序打印ld 查找的搜索路径的方法是什么. 解决方案 您可以通过执行以下命令来做到这一点: ld --verbose |grep SEARCH_DIR |tr -s ';'\\012 gcc 将一些额外的 -L 路径传递给链接器,您可以使用以下命令列出这些路径: gcc -print-search-dirs |sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/ ..
发布时间:2021-12-03 13:17:56 服务器开发

为什么 gcc 中“-l"选项的顺序很重要?

我正在尝试编译一个使用 udis86 库的程序.实际上,我正在使用图书馆的 用户手册 中给出的示例程序.但是编译的时候报错.我得到的错误是: example.c:(.text+0x7): 对“ud_init"的未定义引用example.c:(.text+0x7): 对 'ud_set_input_file' 的未定义引用..example.c:(.text+0x7): 未定义的对 'ud_ins ..
发布时间:2021-12-02 00:05:11 其他开发

如何使用 GCC 和 ld 删除未使用的 C/C++ 符号?

我需要严格优化我的可执行文件的大小(ARM 开发)并且我注意到在我当前的构建方案 (gcc + ld) 中未使用的符号没有被剥离. 将 arm-strip --strip-unneeded 用于生成的可执行文件/库不会改变可执行文件的输出大小 (我不知道为什么,也许是根本不能). 如何(如果存在)修改我的构建管道,以便从生成的文件中删除未使用的符号? 我什至不会想到这一点,但我当 ..
发布时间:2021-12-01 15:50:14 C/C++开发

使用 CMake 强制进行 32 位编译的正确方法

抱歉,有很多类似的问题,但我确实发现谷歌搜索 CMake 查询总是会产生类似但不相同的场景、冲突的 CMake 命令等等! 我需要强制我的项目构建 32 位二进制文​​件,因为我必须链接一个只能作为 32 位使用的库.我根据错误消息对此进行了诊断,例如: /usr/bin/ld: i386 架构的输入文件 `*external-32bit-lib*' 与 i386:x86-64 输出不兼容 ..
发布时间:2021-11-26 14:41:34 C/C++开发

MacOS Catalina 上的 ld64 segprot 不起作用?

我想在 MacOS Catalina(64 位)上创建一个具有可执行数据段的二进制文件(参见 此处 了解详情)但从一开始就无法执行. 我用 制作我的二进制文件 gcc -nostdlib -segprot __DATA rwx rw- .... 我还用gcc创建了一个目标文件,然后直接调用了ld.ld 版本是 $ ld -v@(#)PROGRAM:ld 项目:ld64-5302019 ..
发布时间:2021-11-25 06:56:31 C#

由于 PIC,无法从汇编中的 x86-64 对象链接共享库

我正在将共享库从 32 位移植到 64 位.它由一些程序集(为 NASM 编写)组成,该程序集导出多个程序和一些更高级别的 C 粘合代码.我正在使用 NASM 2.10.01 和 GNU ld 2.22 的 64 位 Debian 机器上构建. 解决了所有推送/弹出问题(推送寄存器的 32 位部分显然在 64 位模式下不起作用)后,我有要组装的对象,但现在我被链接阶段暂停了.这是我的命令行 ..
发布时间:2021-11-25 06:02:34 C#

找不到 crtn.o,在 64 位系统上链接 32 位代码

我正在尝试在 64 位系统上使用 NASM 和 GCC 组装一些 32 位代码.我使用以下两个命令 nasm -f elf32 -g -F stabs coc.asmgcc -m32 -o coc coc.o NASM 看起来不错,但 LD 抱怨: /usr/bin/ld: 找不到 crt1.o: 没有那个文件或目录/usr/bin/ld: 找不到 crti.o: 没有那个文件或目录/usr ..
发布时间:2021-11-25 05:32:25 C#

在 64 位 Ubuntu 中构建 32 位应用程序

经过数小时的谷歌搜索,我决定放弃并请教各位专家.我正在尝试在我的 64 位 Ubuntu 11.10 中构建一个 32 位应用程序(如果有人感兴趣,则为 xgap).我在 makefile 中添加了 CFLAGS=-m32 和 LDFLAGS=-L/usr/lib32.这些对象被内置到 32 位精细中.最后一步是将 X 窗口的所有对象和库链接到这个可执行文件——xgap.不知何故,它不断给我这个错 ..
发布时间:2021-11-24 23:47:28 C#

使用 CMake 强制进行 32 位编译的正确方法

抱歉,有很多类似的问题,但我确实发现谷歌搜索 CMake 查询总是会产生类似但不相同的场景、冲突的 CMake 命令等等! 我需要强制我的项目构建 32 位二进制文​​件,因为我必须链接一个只能作为 32 位使用的库.我根据错误消息对此进行了诊断,例如: /usr/bin/ld: i386 架构的输入文件 `*external-32bit-lib*' 与 i386:x86-64 输出不兼容 ..
发布时间:2021-11-24 23:29:18 C/C++开发

如何防止“main.o:(.eh_frame+0x1c): relocation truncated to fit: R_AARCH64_PREL32 against `.text'";创建 aarch64 裸机程序时?

在创建裸机可执行文件时,我遇到了这个错误: main.o:(.eh_frame+0x1c): 重定位被截断以适应:R_AARCH64_PREL32 对 `.text'collect2:错误:ld 返回 1 个退出状态 然后我设法创建了一个最小的复制示例: main.c void _start(void) {} notmain.S .skip 32 link.ld ENTRY(_ ..
发布时间:2021-11-17 22:44:23 其他开发