【问题标题】:arm-linux-gnueabi-gcc compiled binary not executing on ARMarm-linux-gnueabi-gcc 编译的二进制文件不在 ARM 上执行
【发布时间】:2015-03-28 04:33:35
【问题描述】:

我正在尝试为 ARM-1136J-S 处理器编译 Hello World。当我使用 CodeSourcery arm-none-linux-gnueabi-gcc(2008q3 版)编译 C 源代码时,它在 ARM 上成功执行,但是当我使用 arm-linux-gnueabi-gcc(通过 apt-get 安装)编译相同的代码时Ubuntu 12.01)它给出了以下错误:

./helloworld: line 1: syntax error: unexpected word (expecting ")")

两个可执行文件的readelf显示使用Ubuntu工具链编译的二进制文件具有以下额外属性:

Tag_CPU_unaligned_access: v6
Tag_DIV_use: Not allowed

如何使用 Ubuntu 工具链让它运行?任何人都可以给出一些提示吗?谢谢

【问题讨论】:

  • 真正的问题是什么?这些看起来像信息标签(使用 ARMv6 未对齐的访问模式,并且不使用硬件划分),这两者都非常适合为 ARM-11 设置(因为它们是 ARMv6 架构核心)。
  • 这似乎很不寻常,但问题中没有足够的信息。请逐步解释导致此错误的原因
  • 使用 Code Sourcery 2014q 版本编译应用后,错误消失了。

标签: linux gcc arm


【解决方案1】:
./helloworld: line 1: syntax error: unexpected word (expecting ")")

这看起来根本不像原生代码错误 - 它看起来像脚本错误。你确定“helloworld”实际上是你编译的二进制文件。运行已编译的 C 代码二进制文件不会出现语法错误...

【讨论】:

  • 是的,这是从 Ubuntu 工具链编译的 C 代码。我已经仔细检查过,我也对返回的错误字符串感到困惑。
【解决方案2】:

检查您的内核是否支持 THUMB 二进制文件: zcat /proc/config.gz |grep THUMB

尝试在您的可执行文件上运行“readelf”。如果入口点地址是奇数(表示 THUMB 或混合 ARM/Thumb)并且您的内核缺少 THUMB 可执行文件支持,您的二进制文件将被内核拒绝,并尝试作为 shell 脚本运行。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。通过在链接中添加“-static”,问题就解决了:

    arm-linux-gnueabi-gcc -c test.c -o test.o
    arm-linux-gnueabi-g++ -o test test.o -static
    

    如果您的代码使用“gethostbyname”,您将获得 警告:在静态链接中使用“gethostbyname”..

    但这是另一个问题,不容易解决。

    【讨论】:

      最近更新 更多