【问题标题】:Cross compile error "arm-none-eabi-g++ cannot find entry symbol"交叉编译错误“arm-none-eabi-g++ 找不到入口符号”
【发布时间】:2014-02-08 15:27:55
【问题描述】:

我有一个关于交叉编译的问题。

#include <stdio.h>

int main()
{
    printf("hello\n");
    return 0;
}

这是我使用的一个简单的 hello world 代码。

我正在使用从导师图形下载的 arm-none-eabi-g++。这是错误。 我不知道错过了什么lib。

/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008018
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-abort.o): In function `abort':
abort.c:(.text+0x10): undefined reference to `_exit'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text+0x1c): undefined reference to `_kill'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text+0x44): undefined reference to `_getpid'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text+0x20): undefined reference to `_write'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text+0x18): undefined reference to `_close'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text+0x1c): undefined reference to `_fstat'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text+0x18): undefined reference to `_isatty'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text+0x20): undefined reference to `_lseek'
/home/kang/Utils/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text+0x20): undefined reference to `_read'
collect2: error: ld returned 1 exit status

这是编译器版本。

$ arm-linux-gnueabi-g++ -v

使用内置规范。 COLLECT_GCC=/home/kang/Utils/arm-2013.05/bin/arm-none-eabi-g++ COLLECT_LTO_WRAPPER=/home/kang/Utils/arm-2013.05/bin/../libexec/gcc/arm-none-eabi/4.7.3/lto-wrapper 目标:arm-none-eabi 配置: /scratch/jbrown/2013.05-arm-eabi-release/src/gcc-4.7-2013.05/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-eabi --enable-threads --disable-libmudflap --disable-libssp --disable- libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-gnu-as --with-gnu-ld --with-specs='%{save-temps: -fverbose-asm} -D__CS_SOURCERYGXX_MAJ__=2013 -D__CS_SOURCERYGXX_MIN__ =5 -D__CS_SOURCERYGXX_REV__=23 %{O2:%{!fno-remove-local-statics: -fremove-local-statics}} %{O*:%{O|O0|O1|O2|Os:;:%{ !fno-remove-local-statics: -fremove-local-statics}}}' --enable-languages=c,c++ --disable-shared --enable-lto --with-newlib --with-pkgversion='Sourcery CodeBench Lite 2013.05-23' -- with-bugurl=https://sourcery.mentor.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-headers=yes --with-sysroot=/opt/codesourcery/arm-none-eabi --with-build-sysroot =/scratch/jbrown/2013.05-arm-eabi-release/install/arm-none-eabi --with-gmp=/scratch/jbrown/2013.05-arm-eabi-release/obj/pkg-2013.05-23-arm-none-eabi/arm-2013.05-23-arm-none-eabi.extras/host-libs -i686-pc-linux-gnu/usr --with-mpfr=/scratch/jbrown/2013.05-arm-eabi-release/obj/pkg-2013.05-23-arm-none-eabi/arm-2013.05-23-arm-none-eabi.extras/host-libs -i686-pc-linux-gnu/usr --with-mpc=/scratch/jbrown/2013.05-arm-eabi-release/obj/pkg-2013.05-23-arm-none-eabi/arm-2013.05-23-arm-none-eabi.extras/host-libs -i686-pc-linux-gnu/usr --with-ppl=/scratch/jbrown/2013.05-arm-eabi-release/obj/pkg-2013.05-23-arm-none-eabi/arm-2013.05-23-arm-none-eabi.extras/host-libs -i686-pc-linux-gnu/usr --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-cloog=/scratch/jbrown/2013.05-arm-eabi-release/obj/pkg- 2013.05-23-arm-none-eabi/arm-2013.05-23-arm-none-eabi.extras/host-libs-i686-pc-linux-gnu/usr --with-libelf=/scratch/jbrown/2013.05-arm-eabi-release/obj/pkg-2013.05-23-arm-none-eabi/arm-2013.05-23-arm-none-eabi.extras/host-libs -i686-pc-linux-gnu/usr --disable-libgomp --disable-libitm --enable-poison-system-directories --with-build-time-tools=/scratch/jbrown/2013.05-arm-eabi-release/install/arm-none-eabi/斌 --with-build-time-tools=/scratch/jbrown/2013.05-arm-eabi-release/install/arm-none-eabi/bin 线程模型:单gcc版本4.7.3(Sourcery CodeBench Lite 2013.05-23)

【问题讨论】:

  • 你为什么使用“裸机”工具链?如果您使用的是 Terry Guo 的装备,那么您需要指定--specs=nosys.specs。您还应该展示您是如何编译/链接的。它应该像(假设一个带有 libc 的工具链)一样简单:/usr/arm-linux-gnueabi-gcc mysource.c -o myprogram.exe --sysroot=/usr/arm-linux-gnueabi.

标签: c++ c linux gcc


【解决方案1】:

您下载了错误的工具链。

arm-linux-gnueabi-g++ 是使用arm-none-eabi 构建的,用于裸机程序。这不包含 libc,即标准库(glibc 或 eglibc)不在此工具链中。

因此,您需要下载arm-none-linux-gnueabi 工具链(即arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,而不是arm-2013.11-24-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 )。

要验证上述内容,请键入:

cd /home/kang/Utils/arm-2013.05/arm-none-eabi 

在这里您只会找到bin include lib share,而没有libc 目录。

下载arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2;在这里你会找到一个文件夹arm-2013.05/arm-none-linux-gnueabi/libc

你也可以写验证:

arm-linux-eabi-g++ -print-sysroot and 
arm-none-linux-gnueabi-g++ -print-sysroot

也可以参考之前的这个问题:how to work with external libraries when cross compiling?

【讨论】:

  • 你能把这个答案整理一下吗?
  • 我不认为这是正确的; arm-none-gnueabi 将是裸机,但 arm-linux-gnueabi 中提到的“Linux”应该等同于 arm-none-linux-gnueabi
  • @LightnessRacesinOrbit 请看他上面提到的规格
  • 哦,对,是的。您对此的回答不清楚。所以他下载了错误的工具链并且它的文件名非常容易误导!
  • @LightnessRacesinOrbit 为您提供的信息,他下载了错误的工具链不是通过看到我的答案。
【解决方案2】:

我正在使用 arm-linux-gnueabi-g++。它下载了导师图形。

这是错误的名称。您的所有输出都表明 Mentor Graphics 打包了一个 arm-none-gnueabi 工具链并错误地将其命名为 arm-linux-gnueabi(甚至不符合命名约定)。

对不起,我打错了我的编译器。我正在使用 arm-none-eabi-g++

为自己获取一个 arm-none-linux-gnueabi 工具链版本(即针对 GNU/Linux 而不是 EABI)。

这个将包含与 Linux 操作系统接口的 GCC 运行时。您现在缺少的所有这些功能都是该界面的一部分。

【讨论】:

  • @user3203585: 好了!
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多