ld相关内容

makefile 中的 -I 和 -L 有什么区别?

makefile 中 -I 和 -L 标志的用途是什么? 解决方案 这些通常是链接器命令行的一部分,或者直接在目标操作中提供,或者更常见地分配给 make 将被扩展以形成链接命令的变量.在这种情况下: -L 是包含库的目录的路径.库的搜索路径. -l 是您要链接的库的名称. 例如,如果您想链接到库 ~/libs/libabc.a,您需要添加: -L$(HOME)/lib ..
发布时间:2022-01-11 15:09:03 服务器开发

如何链接到不同的 libc 文件?

由于版本差异,我想与我的程序一起提供共享库,而不是使用目标系统的. ldd 说我的程序使用了这些共享库: linux-gate.so.1 =>(0xf7ef0000)**(内核制作)**libc.so.6 =>/lib32/libc.so.6 (0xf7d88000)**(libc-2.7.so)**/lib/ld-linux.so.2 (0xf7ef1000)**(ld-2.7.so)* ..
发布时间:2022-01-11 15:07:59 其他开发

正在访问“值";C 中的链接描述文件变量未定义行为?

GNU ld(链接器脚本)手册部分 3.5.5 源代码参考 提供了一些关于如何访问链接描述文件“变量"的非常重要的信息.(实际上只是整数地址)在 C 源代码中.我用了这个信息.广泛使用链接器脚本变量,我在这里写了这个答案:如何从 C 中获取 ld 链接描述文件中定义的变量的值. 但是,很容易做错并尝试访问链接描述文件变量的值(错误地)而不是其地址,因为这有点深奥.手册(上面的链接)说: ..
发布时间:2022-01-11 15:07:48 其他开发

链接描述文件中的 KEEP 是什么意思?

LD 手册没有解释什么KEEP 命令确实如此.下面是来自第三方链接器脚本的片段,其中包含 KEEP.ld中的KEEP命令有什么作用? 部分{.文本 :{.=对齐(4);_text = .;提供(stext = .);保持(*(.isr_vector))保持(*(.init))*(.text .text.*)*(.rodata .rodata.*)*(.gnu.linkonce.t.*)*(.gl ..
发布时间:2022-01-11 15:06:14 其他开发

使用 ld 直接链接 C 程序失败,未定义对 `__libc_csu_fini` 的引用

我正在尝试在 Linux 下编译 C 程序.但是,出于好奇,我尝试手动执行一些步骤:我使用: 生成汇编代码的 gcc 前端 然后运行 ​​GNU 汇编程序以获取目标文件 然后将其与 C 运行时链接以获得工作可执行文件. 现在我被链接部分卡住了. 程序是一个非常基础的“Hello world": #include int main() {printf("你好 ..
发布时间:2022-01-11 14:59:06 其他开发

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

对于大学课程,我喜欢比较使用 gcc/clang 和汇编编写和编译的功能相似程序的代码大小.在重新评估如何进一步缩小某些可执行文件的大小的过程中,当我两年前组装/链接的相同汇编代码现在在再次构建后增长超过 10 倍时,我无法相信自己的眼睛(这适用于多个程序,不仅是 helloworld): $ 制作as -32 -o helloworld-asm-2020.o helloworld-asm-20 ..
发布时间:2022-01-11 14:56:15 服务器开发

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

有一个远程 64 位 *nix 服务器可以编译用户提供的代码(应该用 Rust 编写,但我认为这并不重要,因为它使用 LLVM).我不知道它使用哪个编译器/链接器标志,但编译后的 ELF 可执行文件看起来很奇怪——它有 4 个 LOAD 段: $ readelf -e 可执行文件...程序标题:类型 偏移 VirtAddr PhysAddrFileSiz MemSiz 标志对齐...加载 0x0 ..
发布时间:2022-01-11 14:51:42 服务器开发

使用 GNU ld 链接器脚本包含二进制文件

我有一个可用的链接器脚本.我想添加另一个数据部分,其内容是直接从文件中提取的(ld 不应该解析它并提取这些部分等等).我该怎么做? OUTPUT_FORMAT("elf32-i386")进入(开始)部分{.text 0x100000:{*(.multiboot)*(.文本)*(.代码)*(.rodata*)}.数据 : {*(.数据)}.bss:{*(.bss)}kernel_end = .;r ..
发布时间:2022-01-09 19:08:27 其他开发

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

澄清一下,我的问题是指包装/拦截从一个函数/符号到另一个函数/符号的调用当调用者和被调用者使用 GCC 编译器和链接器在同一个编译单元中定义时. 我的情况类似于以下: /* foo.c */无效富(无效){/* ... 一些东西 */酒吧();}空栏(空){/* ... 一些其他的东西 */} 我想包装对这些函数的调用,我可以(在一定程度上)使用 ld 的 --wrap 选项 (然后我实 ..
发布时间:2022-01-08 21:26:41 其他开发

为什么 Linux/gnu 链接器选择地址 0x400000?

我正在 Linux x86_64 上试验 ELF 可执行文件和 gnu 工具链: 我已经链接并(手动)剥离了一个“Hello World"测试: .global _start.文本_开始:移动 $1, %rax... 转换为 267 字节的 ELF64 可执行文件... 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF………… ..
发布时间:2022-01-06 13:01:30 服务器开发

如何在 CMakeLists.txt 中设置 LDFLAGS?

我通过 CMAKE_C_FLAGS 在 CMake 中设置了 CFLAGS.像这样设置 LDFLAGS 吗? 解决方案 这取决于你想要什么: A) 如果要指定链接到哪些库,可以使用 find_library 找到库,然后使用 link_directories 和 target_link_libraries到. 当然,写一个好的find_package 脚本,它很好地添加了带有 ..
发布时间:2021-12-26 21:40:10 其他开发

找不到升压符号

我正在尝试编译/移植旧版本的 OpenOffice.它使用 Boost v1.34.1,它是源代码树的一部分.错误信息如下: 未定义符号:“boost::throw_exception(std::exception const&)",引用自:boost::detail::shared_count::shared_count(ScToken*) in detfunc.old:未找到符号 Boos ..
发布时间:2021-12-24 15:38:14 其他开发

链接 boost 日志教程时的链接器错误(未定义的参考)

我已经通过 yum 在 Fedora 20 上安装了 boost 并且正在尝试一些简单的例子.但是,我无法编译 日志教程中的第一个示例. 使用 g++ -c boosttest.cc 编译工作正常,但是当我尝试将其链接到时出现很多错误 g++ boosttest.o -o boosttest -lboost_log -lpthread 完整的错误日志: boosttest.o:在函数‘ ..
发布时间:2021-12-24 15:04:07 C/C++开发

直接与 ld 链接 C 程序失败,未定义对 `__libc_csu_fini` 的引用

我正在尝试在 Linux 下编译 C 程序.但是,出于好奇,我正在尝试手动执行一些步骤:我使用: 生成汇编代码的 gcc 前端 然后运行 ​​GNU 汇编程序以获取目标文件 然后将其与 C 运行时链接以获取可运行的可执行文件. 现在我被链接部分困住了. 该程序是一个非常基本的“Hello world": #include int main() {printf("你好\n") ..
发布时间:2021-12-18 23:16:33 其他开发

为什么每次运行应用程序时都必须使用导出定义 LD_LIBRARY_PATH?

我有一些代码使用了一些共享库(gcc 上的 c 代码).编译时,我必须使用 -I 和 -L 显式定义包含和库目录,因为它们不在标准位置.当我尝试运行代码时,出现以下错误: ./sync_test./sync_test:加载共享库时出错:libsync.so:无法打开共享对象文件:没有这样的文件或目录 但是,请执行以下操作,一切正常: export LD_LIBRARY_PATH="/path ..
发布时间:2021-12-18 23:11:58 服务器开发

链接到 .so 文件中的旧符号版本

在 x86_64 linux 上使用 gcc 和 ld 我需要链接到新版本的库 (glibc 2.14),但可执行文件需要在旧版本 (2.5) 的系统上运行.由于唯一不兼容的符号是 memcpy(需要 memcpy@GLIBC_2.2.5 但提供 memcpy@GLIBC_2.14 的库),我想告诉链接器,而不是采用 memcpy 的默认版本,它应该采用我指定的旧版本. 我发现了一种非常奇怪 ..
发布时间:2021-12-18 23:05:00 服务器开发

为什么我得到一个 gcc“未定义的引用"?尝试创建共享对象时出错?

为什么我在使用 gcc 时会收到“未定义的引用"错误? 我正在尝试创建一个导出一个函数“external()"的共享对象 (.so).然后我尝试链接到 .so 但得到“未定义的引用‘外部’".我在这里做错了什么? 文件:external.c int external() {返回 5;} 文件:program.c int external();int main(char** arg ..
发布时间:2021-12-18 22:49:35 其他开发