linker 相关问题

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

编译期间使用的标志

我正在编译巨大的C代码库,并且我们正在使用Make构建系统来自动化构建过程。基本上我们使用了很多标志,这些标志分散在多个 make 文件和那些编译器 fl...

回答 1 投票 0

将头文件包含到实现文件中实际上有什么作用?

我正在阅读 Bjarne Stroustrups 使用 C++ 的原理和实践,并在第 8.3 章中遇到有关头文件的以下内容: 为了简化一致性检查,我们在源代码中 #include 标头...

回答 2 投票 0

链接描述文件中自定义 .rawdata 部分的数据完整性问题

我正在使用 ARM Cortex-M4 处理器(特别是 STM32F4 微控制器)开发一个嵌入式项目,并且遇到了与链接器中定义的内存部分相关的特殊问题...

回答 1 投票 0

在 Rust 中静态链接 BFD 会引发错误

我是 Rust 中使用 C 的新手,目前正在尝试使用 BFD 构建二进制加载器。 使用bindgen 生成Rust 绑定非常有效。 在我的 build.rs 中我使用了: println!("货物:生锈...

回答 1 投票 0

与 VS 2022 的命令行链接:致命错误 C1905:前端和后端不兼容(必须针对相同的处理器)

我需要有 Visual Studio 2022 的命令行环境。 它基于一组类似 Unix C-Shell 的脚本(确切地说是 Hamilton C-Shell)。 我很久以前就用 VS 2015 成功做到了这一点...

回答 0 投票 0

MAP 文件分析 - 我的代码大小从何而来?

我正在寻找一种工具来简化分析大型 C++ 项目 (VC6) 的链接器映射文件。 在维护期间,二进制文件稳步增长,我想弄清楚它来自哪里。我怀疑

回答 6 投票 0

ARM Cortex-M4 上链接描述文件中自定义 .rawdata 部分的数据完整性问题

我正在使用 ARM Cortex-M4 处理器(特别是 STM32F4 微控制器)开发一个嵌入式项目,并且遇到了与链接器中定义的内存部分相关的特殊问题...

回答 1 投票 0

ld:找不到用于汇编的库“系统”

我正在尝试在 2020 intel macbook pro 上的 macos sonoma 14.3 上编写程序集,但它一直给我这个错误。 我的代码: .data 节 消息:db“你好”,10 节.文本 全球_...

回答 1 投票 0

在 MKL 中使用自定义 malloc 实现

我正在编写一个程序,使用Intel的MKL来做一些矩阵乘法。我有一个令人沮丧的要求,即仅使用动态内存分配的自定义版本。我知道这...

回答 1 投票 0

将共享库重新链接到不同版本的 libc

我有一个使用特定版本的 libc (GLIBC_2.4) 编译的 Linux 共享库 (.so),我需要在具有不同版本的 libc 的系统上使用它。我没有 qu 的图书馆资源...

回答 3 投票 0

应用程序名称:/lib/libc.so.6:找不到版本“GLIBC_2.8”(应用程序名称需要)

命令的输出:ldd -v appname: linux-gate.so.1 => (0x00949000) libpthread.so.0 => /lib/libpthread.so.0 (0x00cea000) libm.so.6 => /lib/libm.so.6 (0x00a83000) libstdc++.so.6 => ...

回答 2 投票 0

collect2:致命错误:找不到‘ld’编译终止。 ,已安装 binutils

我一直致力于生成共享库,在安装linpack时我不小心替换了 cp linpack-fpm/lib/liblinpack.a /usr/bin/ld ,我尝试参考各种解决方案,例如...

回答 1 投票 0

-O 和 -wrap 的行为

我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #包括 我正在尝试使用 -wrap=symbol 来模拟函数进行单元测试,并且根据传递的 GCC 优化标志发现不同的行为 考虑下面的示例程序 #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> void * __wrap_malloc(size_t sz) { printf("Called %s", __func__); return (void *) 0xDEADBEEF; } int main() { void *ptr; ptr = malloc(10); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } 使用优化时 ❯ gcc -Os -Wl,-wrap=malloc 1.c -o opt ❯ ./opt opt: 1.c:16: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 12546 abort ./opt 未经优化 ❯ gcc -Wl,-wrap=malloc 1.c -o without_opt ❯ ./without_opt Called __wrap_malloc 我尝试反汇编可执行文件 优化 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: b9 20 06 40 00 mov $0x400620,%ecx 400459: ba 10 00 00 00 mov $0x10,%edx 40045e: be ea 05 40 00 mov $0x4005ea,%esi 400463: bf ee 05 40 00 mov $0x4005ee,%edi 400468: e8 d3 ff ff ff callq 400440 <__assert_fail@plt> 40046d: 0f 1f 00 nopl (%rax) 未经优化 000000000040053e <main>: 40053e: 55 push %rbp 40053f: 48 89 e5 mov %rsp,%rbp 400542: 48 83 ec 10 sub $0x10,%rsp 400546: bf 0a 00 00 00 mov $0xa,%edi 40054b: e8 c7 ff ff ff callq 400517 <__wrap_malloc> 400550: 48 89 45 f8 mov %rax,-0x8(%rbp) 400554: 48 8b 45 f8 mov -0x8(%rbp),%rax 400558: 3d ef be ad de cmp $0xdeadbeef,%eax 40055d: 74 19 je 400578 <main+0x3a> 40055f: b9 4e 06 40 00 mov $0x40064e,%ecx 400564: ba 10 00 00 00 mov $0x10,%edx 400569: be 0a 06 40 00 mov $0x40060a,%esi 40056e: bf 10 06 40 00 mov $0x400610,%edi 400573: e8 c8 fe ff ff callq 400440 <__assert_fail@plt> 400578: b8 00 00 00 00 mov $0x0,%eax 40057d: c9 leaveq 40057e: c3 retq 40057f: 90 nop 没有调用wrap_malloc。看起来已经优化了。然后我尝试添加打印语句 int main() { void *ptr; ptr = malloc(10); >> printf("0x%x\n", (uintptr_t)ptr); assert(0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)); return 0; } ❯ gcc -Os -Wl,-wrap=malloc 1.c -o print_opt ❯ ./print_opt Called __wrap_malloc0xdeadbeef print_opt: 1.c:17: main: Assertion `0xDEADBEEF == (unsigned int)(uintptr_t)(ptr)' failed. [1] 31575 abort ./print_opt 现在我看到包装的函数被调用。但断言失败了 0000000000400450 <main>: 400450: 48 83 ec 08 sub $0x8,%rsp 400454: bf 0a 00 00 00 mov $0xa,%edi 400459: e8 f9 00 00 00 callq 400557 <__wrap_malloc> 40045e: bf 0a 06 40 00 mov $0x40060a,%edi 400463: 48 89 c6 mov %rax,%rsi 400466: 31 c0 xor %eax,%eax 400468: e8 c3 ff ff ff callq 400430 <printf@plt> 40046d: b9 48 06 40 00 mov $0x400648,%ecx 400472: ba 11 00 00 00 mov $0x11,%edx 400477: be 10 06 40 00 mov $0x400610,%esi 40047c: bf 14 06 40 00 mov $0x400614,%edi 400481: e8 ba ff ff ff callq 400440 <__assert_fail@plt> 400486: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 40048d: 00 00 00 有人可以帮助我理解为什么/如何看到这种行为吗?预先感谢 对于 gcc,malloc() 被视为所谓的 “内置”函数,优化器会意识到并专门处理它(例如,它可以对其返回值做出某些假设,这会导致它自动失败)断言而不需要对其进行运行时测试)。如果您将 -fno-builtin-malloc 添加到编译选项中,则该特殊处理将被禁用: $ gcc -Os -fno-builtin-malloc -Wl,-wrap=malloc 1.c -o opt $ ./opt Called __wrap_malloc

回答 1 投票 0

MPLAB X32 编译器和将函数移至 RAM 会导致链接器错误

我正在使用 Microchips XC32 C 编译器和工具为 SAM E70 处理器构建可执行文件。 我必须创建一个从 RAM 而不是 ROM/Flash 执行的函数,因为该函数使用特殊...

回答 1 投票 0

链接器如何控制静态库中定义的main()的可见性?

如果我在静态库 libmy.a 中定义 main() 函数(就像 flex libl.a 那样), $ nm /usr/lib/x86_64-linux-gnu/libl.a libmain.o: U_GLOBAL_OFFSET_TABLE_ U出口

回答 1 投票 0

CMake 中的 MySql 连接器/C++

我安装了 MySql 连接器,我想在我的 C++ 应用程序中使用它来连接到数据库,尽管我无法链接该库。我尝试了其他堆栈问题的方式,所以我这样做了: 设置(

回答 1 投票 0

CFLAGS 和 LDFLAGS 与 CPATH 和 LIBRARY_PATH 对比

在此主题中 https://unix.stackexchange.com/questions/149359/what-is-the- Correct-syntax-to-add-cflags-and-ldflags-to-configure 有人说 CFLAGS 和 LDFLAGS 并不适用于所有配置

回答 1 投票 0

嵌入式Lua 5.4.2链接错误

我正在尝试使用 CLion IDE 和 CMake 使用 C 中嵌入的 Lua,但遇到了链接器错误。 运行该程序时,我得到未定义的符号:_luaL_newstate: #include“lua.h” #

回答 1 投票 0

预处理器和链接器的功能不明确

请有人澄清我的疑问,在编译过程中,预处理器替换了预定义函数的声明,而不是定义,那么为什么我们在编译过程中没有收到错误

回答 1 投票 0

如何在CMake中正确链接libssh

我正在尝试使用 libssh 库做一些事情,同时也从一本关于 CMake 的书开始。 当我编译时,出现以下错误: intero@:~/Documents/projects/c/fastDeploy/build$ make

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.