【问题标题】:How to disable SVC ARM instruction (gcc, uclibc, buildroot)?如何禁用 SVC ARM 指令(gcc、uclibc、buildroot)?
【发布时间】:2013-03-28 09:42:56
【问题描述】:

我正在使用 buildroot。 编译工作正常,但目标系统上的二进制文件显示“非法指令”

我用过strace:

execve("/opt/busybox", ["/opt/busybox"], [/* 8 vars */]) = 0 brk(0)
= 0 --- SIGILL {si_signo=SIGILL, si_code=ILL_ILLTRP, si_addr=0xa3f20} --- +++ 被 SIGILL 杀死 +++ 非法指令

然后是 IDA。

原因是 SVC 指令(si_addr 在我尝试的所有二进制文件中都指向它)

我应该怎么做才能防止 GCC 使用这条指令?

【问题讨论】:

  • 这是SuperVisor Call,用于进行系统调用——你需要它。问题可能是内核与您要构建的内容不匹配。
  • 是的。内核已经编译和安装。我现在不能改变它:(我也没有来自现有内核的源代码/配置。
  • 我重新标记了 Linux(不是 SVC),这是一些 Microsoft Web 服务器的东西,我尝试update the wiki。我将研究 EABIOABI,这会改变 SVC/SWI 调用接口。请参阅trap.c 您可以在内核命令行中使用user_debug=0xff 引导。
  • 那么,EABI 是 SVC 而 OABI 是 SWI 吗?

标签: linux gcc arm buildroot uclibc


【解决方案1】:

看来我已经解决了这个问题。

原因是 EABI / OABI 配置错误。感谢朴实的噪音! 我需要 OABI 配置。

另外,我真的不知道为什么,但它仅在 GCC 4.3.x 上开始工作 在 gcc 4.7.x 的默认 buildroot 配置上 eabi/oabi 无效。

最后,我设置了额外的 GCC 选项:

--with-march=armv5te --with-cpu=arm926ej-s --with-mtune=arm926ej-s --enable-multilib --disable-libssp --enable-languages=c,c++

【讨论】:

  • OABI 已被弃用,您应该真正使用 EABI 支持构建您的内核,并构建您的所有用户空间 EABI。
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多