arm-none-eabi 链接器引用未使用的符号

问题描述 投票:0回答:0

我发现 gcc 有问题。我有一个在 CMake 中构建的 NXP 处理器项目,但我遇到了一些奇怪的错误。

这是裸机,我不需要也不打算支持半主机。一些 NXP 代码使用 assert() 并变成 __assert_func(),它从 libc.a、libc_nano.a、libg.a 或 libg_nano.a 中提取,来自 arm-gnu-toolchain-12.2.mpacbti-rel1-mingw- w64-i686-arm-none-eabi/lib/gcc/arm-none-eabi/12.2.1/thumb/v6-m/nofp .

但是当 __assert_func() 被引入时,它也会引入一堆从未被调用的其他东西,比如 _lseek_r 等。许多从未被引用的普通 libc 类型函数。我使用 objdump -S 反汇编 ELF 文件,但它们从未被调用过。

我在互联网上搜索了很多,有些人说我需要做的就是包含一个文件,该文件已将所有这些调用存根。我正在从事一个项目,其中一个代码标准没有死机或未使用的调用。提供存根是行不通的。

我写了自己的 __assert_func() 并且不再被拉入。

无关的符号不再在 ELF 文件中,但是当它链接时我看到了

thisc:/users/daniel/tools/12.2_mpacbti-rel1/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none- eabi/bin/ld.exe: c:/users/daniel/tools/12.2_mpacbti-rel1/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v6-m/nofp\libg_nano .a(libc_a-writer.o): 在函数`_write_r'中:

writer.c:(.text._write_r+0x10): warning: _write 未实现,将始终失败:

我看到 _close、_seek、_read 和 _write。

这些是我在 CMake 中的链接选项

add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map) add_link_options(-mfloat-abi=soft -mcpu=${MCPU} -mthumb -mthumb-interwork --specs=nosys.specs --specs=nano.specs -o ${PROJECT_NAME}.elf)

如我所见,问题是链接器似乎认为我需要这些其他函数调用,即使它们最终从 ELF 文件中删除。

我尽我所能来解决这个问题。我已经更改了链接器选项、库的顺序、调用了特定的库。

linker arm embedded bare-metal
© www.soinside.com 2019 - 2024. All rights reserved.