ld相关内容
gcc 和 ld 提供了多种指定库搜索路径的方法——其中包括 -rpath 和 -L 标志.联机帮助页显示这两个标志之间没有区别,实际上是说每个标志都将一个库添加到库搜索路径中.然而,这两个标志完全做同样的事情似乎很奇怪.这两个选项之间有什么区别(如果有)? 解决方案 您必须阅读一些过时的联机帮助页副本(已添加重点): -rpath=dir 将目录添加到运行时库搜索路径.
..
如何将两个 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 可执行文件 如果您有权访问源文件,-combine GCC 标志将在编译前合并源文件: $ gcc -c -combine a.c b.c -o c.o 然而这仅适用
..
澄清一下,我的问题是指包装/拦截从一个函数/符号到另一个函数/符号的调用当调用者和被调用者在 GCC 编译器和链接器的同一编译单元中定义时. 我有类似以下的情况: /* foo.c */无效 foo(void){/* ...一些东西*/酒吧();}空栏(空){/* ...一些其他的东西*/} 我想包装对这些函数的调用,我可以用 ld 的 --wrap 选项(然后我实现了 __wrap_f
..
为方便起见,我在下面添加了相关的联机帮助页. 我的(错误)理解首先:如果我需要用 , 分隔选项,那意味着第二个 -Wl 不是另一个选项,因为它在 之前>, 表示它是 -rpath 选项的参数. 我不明白 -rpath 怎么会有 -Wl,. 参数! 我认为有意义的是: -Wl,-rpath . 这应该使用当前目录参数调用 -rpath 链接器选项. man gcc:
..
这些命令行选项的目的是什么?请帮忙解读以下命令行的含义: -Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib 显然它与链接有关,但 GNU 手册没有说明分组的确切含义. 解决方案 用于解决几个库之间的循环依赖(列在 -( 和 -) 之间). 引用 为什么库链接的顺序有时会导致 GC
..
我正在构建一个简单的 C++ 程序,我想暂时用更新版本的系统提供的共享库替换它,以进行开发和测试. 我尝试设置 LD_LIBRARY_PATH 变量,但链接器 (ld) 失败: /usr/bin/ld: 找不到 -lyaml-cpp 我希望它可以工作,因为根据 ld 手册页: 链接器使用以下搜索定位所需共享的路径库:...对于本机链接器,环境变量的内容“LD_LIBRARY
..
对于大学课程,我喜欢比较使用 gcc/clang 与汇编编写和编译的功能相似程序的代码大小.在重新评估如何进一步缩小某些可执行文件的大小的过程中,当我 2 年前组装/链接的完全相同的汇编代码在重新构建后现在已经增长了 10 倍时,我简直不敢相信自己的眼睛(这适用于多个程序,不仅是 helloworld): $ makeas -32 -o helloworld-asm-2020.o hellowo
..
有一个远程 64 位 *nix 服务器可以编译用户提供的代码(应该用 Rust 编写,但我认为这无关紧要,因为它使用的是 LLVM).我不知道它使用哪个编译器/链接器标志,但编译后的 ELF 可执行文件看起来很奇怪 - 它有 4 个 LOAD 段: $ readelf -e 可执行文件...程序标题:类型 Offset VirtAddr PhysAddrFileSiz MemSiz 标志对齐..
..
好吧,我认为我的问题有点有趣,我想了解我的 Ubuntu 机器中发生了什么. 我编译并使用 gcc -lm -o useless useless.c 链接了以下无用的代码: /*文件无用.c*/#include #include int main(){int 样本 = (int)(0.75 * 32768.0 * sin(2 * 3.14 * 440 * ((float)
..
当我尝试构建以下程序时: #include int main(void){printf("你好世界\n");返回0;} 在 OS X 10.6.4 上,具有以下标志: gcc -static -o blah blah.c 它返回这个: ld:未找到 -lcrt0.o 的库collect2: ld 返回 1 个退出状态 有没有其他人遇到过这种情况,或者其他人尚未受到影响?有什么解决办法吗
..
按搜索顺序打印ld 查找的搜索路径的方法是什么. 解决方案 您可以通过执行以下命令来做到这一点: ld --verbose |grep SEARCH_DIR |tr -s ';'\\012 gcc 将一些额外的 -L 路径传递给链接器,您可以使用以下命令列出这些路径: gcc -print-search-dirs |sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/
..
我正在尝试编译一个使用 udis86 库的程序.实际上,我正在使用图书馆的 用户手册 中给出的示例程序.但是编译的时候报错.我得到的错误是: example.c:(.text+0x7): 对“ud_init"的未定义引用example.c:(.text+0x7): 对 'ud_set_input_file' 的未定义引用..example.c:(.text+0x7): 未定义的对 'ud_ins
..
我需要严格优化我的可执行文件的大小(ARM 开发)并且我注意到在我当前的构建方案 (gcc + ld) 中未使用的符号没有被剥离. 将 arm-strip --strip-unneeded 用于生成的可执行文件/库不会改变可执行文件的输出大小 (我不知道为什么,也许是根本不能). 如何(如果存在)修改我的构建管道,以便从生成的文件中删除未使用的符号? 我什至不会想到这一点,但我当
..
抱歉,有很多类似的问题,但我确实发现谷歌搜索 CMake 查询总是会产生类似但不相同的场景、冲突的 CMake 命令等等! 我需要强制我的项目构建 32 位二进制文件,因为我必须链接一个只能作为 32 位使用的库.我根据错误消息对此进行了诊断,例如: /usr/bin/ld: i386 架构的输入文件 `*external-32bit-lib*' 与 i386:x86-64 输出不兼容
..
我想在 MacOS Catalina(64 位)上创建一个具有可执行数据段的二进制文件(参见 此处 了解详情)但从一开始就无法执行. 我用 制作我的二进制文件 gcc -nostdlib -segprot __DATA rwx rw- .... 我还用gcc创建了一个目标文件,然后直接调用了ld.ld 版本是 $ ld -v@(#)PROGRAM:ld 项目:ld64-5302019
..
我正在将共享库从 32 位移植到 64 位.它由一些程序集(为 NASM 编写)组成,该程序集导出多个程序和一些更高级别的 C 粘合代码.我正在使用 NASM 2.10.01 和 GNU ld 2.22 的 64 位 Debian 机器上构建. 解决了所有推送/弹出问题(推送寄存器的 32 位部分显然在 64 位模式下不起作用)后,我有要组装的对象,但现在我被链接阶段暂停了.这是我的命令行
..
我正在尝试在 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
..
经过数小时的谷歌搜索,我决定放弃并请教各位专家.我正在尝试在我的 64 位 Ubuntu 11.10 中构建一个 32 位应用程序(如果有人感兴趣,则为 xgap).我在 makefile 中添加了 CFLAGS=-m32 和 LDFLAGS=-L/usr/lib32.这些对象被内置到 32 位精细中.最后一步是将 X 窗口的所有对象和库链接到这个可执行文件——xgap.不知何故,它不断给我这个错
..
抱歉,有很多类似的问题,但我确实发现谷歌搜索 CMake 查询总是会产生类似但不相同的场景、冲突的 CMake 命令等等! 我需要强制我的项目构建 32 位二进制文件,因为我必须链接一个只能作为 32 位使用的库.我根据错误消息对此进行了诊断,例如: /usr/bin/ld: i386 架构的输入文件 `*external-32bit-lib*' 与 i386:x86-64 输出不兼容
..
在创建裸机可执行文件时,我遇到了这个错误: main.o:(.eh_frame+0x1c): 重定位被截断以适应:R_AARCH64_PREL32 对 `.text'collect2:错误:ld 返回 1 个退出状态 然后我设法创建了一个最小的复制示例: main.c void _start(void) {} notmain.S .skip 32 link.ld ENTRY(_
..