【问题标题】:arm-eabi-gcc: cannot find entry symbol _startarm-eabi-gcc:找不到入口符号 _start
【发布时间】:2015-02-13 19:50:48
【问题描述】:

我已经安装了两个工具链来在 x86 主机上编译 ARM/Linux。现在,我必须使用 arm-eabi-gcc 为 ARM/Linux (Android) 编译一个程序。这个编译器没有任何库可以在 Linux 中使用,所以我需要执行下一个命令来编译 C 程序:

arm-eabi-gcc hello.c -I/home/alejandro/android-ndk-r10c/platforms/android-21/arch-arm/usr/include -nostdlib -Wl,-rpath-link=/usr/arm-linux-gnueabi/lib -L/usr/arm-linux-gnueabi/lib -lc

但是当我编译它时,我得到一个链接器警告:

ld:警告:找不到入口符号_start;默认为 000080b0

我应该怎么做才能正确链接所有内容?

【问题讨论】:

    标签: linux gcc arm


    【解决方案1】:

    只需去掉选项 -nostdlib 试试,因为编译器认为不允许使用存在 _start 函数的启动文件。

    但还有其他方法

    。实现你自己的crt0.o,它基本上应该包含_start函数

     void _start()
    
    {
    
    
    ctor_dtor_hook *hook;
    
    
    
    __syslib_init();
    
    for (hook = __CTORS__; *hook; hook++)
         (*hook)();
    
    main();
    
    for (hook = __DTORS__; *hook; hook++)
         (*hook)();
    }
    

    如果您尝试实现 c++,请使用 int main()

    并将 crt0.o 对象链接到您正在运行的程序并放入 -nostdlib

    【讨论】:

      【解决方案2】:

      _start 存在于 C 运行时库中。您需要将其与您的二进制文件链接起来。在 Linux 上,这通常位于名为 crt0.a 的文件中,并且可能是由您的编译器或 LibC 构建的。

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 2016-01-21
        • 2018-12-23
        • 2014-02-08
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多