6

我有一个带有嵌入式 linux 的“Seagate Central”NAS

$ cat /etc/*release
MontaVista Linux 6, (.dev-snapshot-20130726)

当我尝试在此 NAS 上运行我自己的应用程序时,它将被“杀死”,而 dmesg 或 /var/log/messages 上没有任何通知

$ cat /proc/cpuinfo
Processor       : ARMv6-compatible processor rev 4 (v6l)
BogoMIPS        : 279.34
Features        : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb02
CPU revision    : 4

Hardware        : Cavium Networks CNS3420 Validation Board
Revision        : 0000
Serial          : 0000000000000000

我的工具链是

Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/arm-none-linux-gnueabi

我的编译开关是

-march=armv6k -mcpu=mpcore -mfloat-abi=softfp -mfpu=vfp

如何找出哪个进程正在杀死我的应用程序,或者我必须更改哪些设置?

PS:我创建了一个简单的 HelloWorld 应用程序,它也无法正常工作!

$ ldd Hello
$       not a dynamic executable


readelf -a Hello
=> http://pastebin.com/kT9FvkjE

readelf -a zip
=> http://pastebin.com/3V6kqA9b

更新 1

我用硬浮点编译了一个新的二进制文件

 Readelf output
 http://pastebin.com/a87bKksY

但没有成功;(

我想这确实是一个“锁定”主题,它阻止了我的应用程序执行。我怎样才能找出是什么应用程序杀死了我的?或者我怎样才能禁用这种功能?

4

4 回答 4

3

使用这些编译器开关:

-march=armv6k -Wl,-z,max-page-size=0x10000,-z,common-page-size=0x10000,-Ttext-segment=0x10000

另请参阅有关工具链的此链接。

您可以针对其中一个内置二进制文件(例如/usr/bin/nano )运行readelf -a以查看节标题中的正确文本段偏移量和程序标题中的页面大小/对齐方式。上述编译器标志使自编译程序与内置二进制文件的结构相匹配,并且已经过测试可以工作。Seagate Central NAS 似乎使用 0x10000 的页面大小/偏移量,而 ARM gcc 的默认值为 0x8000。

编辑:我看到你已经跑了readelf。您的 pastebin 显示

HelloWorld:[ 1] .interp           PROGBITS        00008134 000134 000013 00   A  0   0  1
       zip:[ 1] .interp           PROGBITS        00010134 000134 000013 00   A  0   0  1

值 10134-134=10000(十六进制)产生正确的文本段链接器选项。再往下(LOAD...)是对齐说明符,对于您的 HelloWorld,它是 0x8000,而对于内置 zip,它是 0x10000。以我的经验,软浮动并没有引起问题。

于 2014-07-06T15:50:33.970 回答
1

你有没有看到任何输出?

您的应用程序是动态链接的吗?

如果是这样,请使用详细选项运行动态链接器(您必须找出平台上动态链接器的名称,对于 Arch linux,它是ldd):

ldd --verbose 'your_program_name'

这将告诉您是否缺少任何依赖项(共享库等)

readelf -a 'your_program_name'

确保中提到的文件Requesting program interpreter: /lib/ld-linux.so.2存在。在这种情况下,该文件名是/lib/ld-linux.so.2

如果这无法帮助您找出问题,请在您的问题中发布完整的ldd --verbose 'your_program_name'输出readelf -a 'your_program_name'

另一个问题可能是 NAS 软件只是杀死了外国程序。我不确定为什么会这样,但我们在这里谈论的是一家大公司(希捷),他们有时对世界的运作方式有奇怪的想法......

编辑,查看 readelf 的 pastebin 后:

据我所知,您的 Hello 可执行文件与 zip 可执行文件有 2 个不同之处:

  • 它不是动态链接的,因此会抛出一大堆要寻找的问题。

  • 这两个程序的构建方式有所不同。zip 不使用 softfloats 而 Hello 使用。我怀疑软浮点依赖是由于以下编译器开关中的一个或两个引起的:-mfloat-abi=softfp -mfpu=vfp

Hello Flags: 0x5000202, 有入口点, Version5 EABI, soft-float ABI

zip 标志:0x5000002,有入口点,版本 5 EABI

我将从以下任一开始:

  • 从 Hello 构建中删除 soft-float 选项或:
  • 确保软浮点仿真库在机器上。我不知道这将依赖于哪些库,但我确实记得 MontaVista 在我最后一次接触他们的软件时提供了它们。我接触 MontaVista 已经 8 年多了,所以它笼罩在一点旧记忆的迷雾中。
于 2013-10-29T08:23:03.380 回答
1

这是一个旧线程,但我只想补充一点,我今天成功为这个旧 NAS 编译了一个“hello world”。

跑步ld-linux.so.3 <app>告诉我

ELF 加载命令对齐不是页面对齐的

谷歌搜索,我发现了这个:https ://github.com/JuliaLang/julia/issues/33293 ,它指向了链接器选项:

-Wl,-z,max-page-size=0x10000

使用这些选项编译产生了真正有效的 ELF!

于 2021-03-23T11:53:46.180 回答
0

你确定你的编译选项是正确的吗?尝试以下操作:

  • strace 您的应用程序(如果 strace 存在于 NAS 上)
  • 下载 NAS 二进制文件之一并arm-none-linux-gnueabi-readelf -a在其上运行,在您的 helloworld 程序上执行相同操作,查看 abi 标签是否不同。

它看起来像是非法指令问题、浮点问题或不兼容的 libc 问题。

编辑:根据 readelf 输出,nas 程序是在没有软浮点的情况下编译的,你应该试试。

于 2013-10-29T08:32:03.550 回答