linux应用程序被杀死

时间:2013-10-29 07:03:57

标签: linux toolchain nas

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

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

当我尝试在此NAS上运行我自己的应用程序时,它将“ Killed ” 没有任何关于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 个答案:

答案 0 :(得分:2)

使用这些编译器开关:

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

另见this link regarding the toolchain.

您可以对其中一个内置二进制文件(例如 / 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。根据我的经验,软浮动并没有造成问题。

答案 1 :(得分:1)

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

运行 ld-linux.so.3 <app> 告诉我

<块引用>

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

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

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

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

答案 2 :(得分:0)

你看到任何输出吗?

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

如果是这样,使用verbose选项运行动态链接器(您必须在平台上找出动态链接器的名称,对于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,你好。我怀疑soft-float依赖是由于这些编译器开关中的一个或两个:-mfloat-abi=softfp -mfpu=vfp

  

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

     

zip标志:0x5000002,有入口点,Version5 EABI

我从以下两个开始:

  • 从Hello构建中删除soft-float选项或:
  • 确保软浮动仿真库在计算机上。我不知道这将取决于哪些库,但我确实记得MontaVista在我最后一次触摸他们的软件时提供它们。自从我触及MontaVista以来已经有8年多的时间了,所以它在一些旧的记忆迷雾中蒙上阴影。

答案 3 :(得分:0)

您确定您的编译选项是否正确? 请尝试以下方法:

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

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

编辑:根据readelf输出,nas程序编译时没有软浮动,你应该试试。