exit.c:(.text+0x18): 使用 arm-none-eabi-gcc 时未定义对 `_exit' 的引用

Posted

技术标签:

【中文标题】exit.c:(.text+0x18): 使用 arm-none-eabi-gcc 时未定义对 `_exit\' 的引用【英文标题】:exit.c:(.text+0x18): undefined reference to `_exit' when using arm-none-eabi-gccexit.c:(.text+0x18): 使用 arm-none-eabi-gcc 时未定义对 `_exit' 的引用 【发布时间】:2013-10-25 12:48:16 【问题描述】:

我是微控制器领域的新手。我需要移植一个为 AVR 微控制器编译程序的 IDE,以便为 ARM 微控制器编译程序。我刚刚将编译器从 AVR 替换为 ARM,并按照某人的说法添加了一些选项。 以下是命令:

\ARM-GCC\bin\arm-none-eabi-gcc -O0 -ffunction-sections -Wall -std=gnu99 -mfloat-abi=soft 
-Wa,-adhlns="$@.lst" -fmessage-length=0 -mcpu=cortex-m0 -mthumb -g3 -gdwarf-2 -Wl,
--gc-sections -o <Dir_name>\Build_Files\Blink_arm.cpp.elf  <Dir_name>\Build_Files\Blink_arm.cpp.o <Dir_name>\Build_Files\core.a 
-L<Dir_name>\Build_Files -lm 

当我执行它时,我得到以下错误:

tools/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.6.2\libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text+0x18): undefined reference to `_exit'  
collect2: ld returned 1 exit status

我可以就这个错误是什么以及如何解决它获得一些帮助。而且我不知道命令行中的那些选项指定了什么。

【问题讨论】:

在您的 ARM libc(与您的编译器捆绑在一起)中,exit() 函数调用了未在任何库中定义的 _exit()。您的编译器必须设置不正确,尽管您可以通过自己定义 void _exit(int status) 来执行快速修复(注意:这将不起作用,因为您的 libc 声明 _exit() 具有不同的签名。您的 _exit() 可以简单地停止无限循环,就像它的 AVR 对应物一样。修复您的 GCC 安装是值得推荐的选择。 见:newlib syscalls;如果没有为您的董事会实施,您需要实施这些。此外,您的代码可能存在问题。 Newlib 不支持一切。请参阅Gatliff's newlib 概述。 【参考方案1】:

我遇到了同样的问题。 解决方法如下:

将选项-ffreestanding -flto 添加到编译器调用行。 并将选项-flto -ffreestanding -nostdlib 添加到链接器调用行中。

【讨论】:

我认为链接器不允许使用 -f 选项,对吧?这是我的闪亮错误arm-none-eabi-ld: -f may not be used without -shared【参考方案2】:

使用--specs=nosys.specs:

arm-none-eabi-gcc --specs=nosys.specs $(OTHER_LINK_OPTIONS)

参考:

ARM Options GNU Tools for ARM Embedded Processors

【讨论】:

感谢日志。这个评论应该被接受为正确的答案,imo。【参考方案3】:

在一台机器/架构中编译带有arm-none-eabi-gcc 的文件以将其加载到 ARM 目标机器时会发生这种情况。很可能您没有使用半主机,您想重新定位。

ARM® Compiler 工具链版本 4.1 表示:

Semihosting 是一种机制,它允许在 ARM 目标上运行的代码进行通信和 在运行调试器的主机上使用输入/输出工具。

来自工具链的 readme.txt(在文件夹 .../gcc-arm-none-eabi-VERSION/share/doc/gcc-arm-none-eabi 下):

** 非半托管/重定向

如果您使用重定向,则链接如下: $ arm-none-eabi-gcc --specs=nosys.specs $(OTHER_LINK_OPTIONS)

对我来说--specs=nosys.specs 已经足够了;)

【讨论】:

以上是关于exit.c:(.text+0x18): 使用 arm-none-eabi-gcc 时未定义对 `_exit' 的引用的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcess 命令行参数

0x18 总结与练习

python交互模式

18/09/26-2-BugKu-逆向-easy100(LCTF)

cmpl $0x1, -0x18(ebp) 在 AT&T 中有啥作用? [复制]

为啥我的可执行文件中的入口点地址是 0x8048330? (0x330 是 .text 部分的偏移量)