c - 对 `main' 和 _sbrk 的 undefined reference - 自己的静态库中的启动代码

标签 c gcc linker arm undefined-reference

我正在使用 GNU ARM 嵌入式工具链 (gcc-arm-none-eabi-5_4-2016q2) 开发 Cortex-M4(STM32F4-Discovery 板)。我的代码的硬件相关部分(HAL-lib、CMSIS、启动等)构建在静态库中,我尝试将其链接到我的应用程序代码。我的应用程序代码包含一个 main 符号,我的库包含一个 _sbrk 符号。这些是错误消息:

engine_control/source/os/release/libkosmos-arm-stm32f4-discovery.a(_startup.o): In function `_start': 
_startup.c:(.after_vectors+0x9a): undefined reference to `main'

和:

/opt/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-sbrkr.o): In function `_sbrk_r': 
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'

我认为我的链接顺序有问题。这是我的链接命令:

arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Werror -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wconversion -Wpointer-arith -Wpadded -Wshadow -Wlogical-op -Waggregate-return -Wfloat-equal -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"config/linker" --specs=nano.specs -L/home/tkl/git/engine_control/source/os/release -Wl,-Map,"/home/tkl/git/engine_control/release/map/arm/release/.map" -lkosmos-arm-stm32f4-discovery -o "/home/tkl/git/engine_control/release/execute/arm/release/.elf" 

我做错了什么?

最佳答案

请注意,如果您将启动代码放入库中,链接器可能没有充分的理由将其拉入 - 没有人要求它,因为通常没有代码的其他部分调用它 - 您不惜一切代价想要在图像中添加的东西就像链接期间需要启动代码位于目标文件中一样。该目标文件可能应该首先出现在链接行上(因为它通常调用 main 和所有其他类型的符号,并且这些符号需要按照链接顺序出现在它之后为了正确解析符号)。

另一个是 sbrk_r 提示没有引用 sbrk - 我假设这两个都在你的库中。通过 ranlib 运行您的库以创建正确的索引可以解决此问题。

关于c - 对 `main' 和 _sbrk 的 undefined reference - 自己的静态库中的启动代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39037971/

相关文章:

c - 如何在C中创建基于字母的选项

c - while 循环不继续,在 1 次迭代后退出

c++ - 编译标志 -static 对于 gcc 真正意味着什么

c - 如何在 Mac OS 上安装包含可选字符串函数的 C11 编译器?

xcode - 链接被提升.. 什么是-rpath? macOS X

c - C中函数casin的使用

c - 反转字符串中的每个特定行

c - 如何让 gcc 警告返回局部变量的地址?

c++ - fatal error LNK1127 : library is corrupt --> after adding extern "C" to function prototype

c++ - 在 Kubuntu 18.10 上链接的 Vulkan SDK 版本 1.1.85.0