linker 相关问题

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

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

LINK:致命错误 LNK1117:选项“LTCG:增量”中存在语法错误

我有一个C++项目。这是基于 v120 的。我将项目重新定位到 v140,在构建时出现以下错误。 链接:致命错误 LNK1117:选项“LTCG:增量”中的语法错误 如何...

回答 1 投票 0

就机器代码而言,链接静态库.a文件与链接.o对象文件集合有什么区别?

两种情况下的汇编指令是否相同?或者可执行文件完全不同? 它可能会影响执行性能吗? 链接库会不会产生一些

回答 1 投票 0

如何在链接描述文件中添加一个目录的所有目标文件?

我的嵌入式 C 项目的一个软件模块对于该模块的每个版本都有不同数量的源文件。 注意:发生这种情况是因为它们是由代码生成工具自动生成的......

回答 2 投票 0

不使用标准库但使用 _start 标签(入口点)进行编译

我正在构建自己的 32 位 x86 操作系统,在其中从 ELF 文件加载用户程序。当编译用户 C 程序时,我使用 -nostdlib 来排除 GLIBC 并链接我自己的 LIBC。问题是...

回答 1 投票 0

所有gcc版本都支持gcc的@file选项吗?

据我记得一些较旧的 gcc 版本不支持 @file 选项。我不太确定。有人可以给出与此相关的任何指示吗? 以供参考 @文件 读取命令行选项

回答 3 投票 0

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