我有一个带有嵌入式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
我用硬浮动
编写了一个新的二进制文件 Readelf output
http://pastebin.com/a87bKksY
但没有成功;(
我想这实际上是一个“锁定”主题,它阻止我的应用程序执行。我如何找出杀死我的应用程序? 或者我该如何禁用这种功能?
答案 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
我从以下两个开始:
答案 3 :(得分:0)
您确定您的编译选项是否正确? 请尝试以下方法:
arm-none-linux-gnueabi-readelf -a
,在helloworld程序中执行相同操作,查看abi标记是否不同。它看起来像是非法指令问题,浮点问题或不兼容的libc问题。
编辑:根据readelf输出,nas程序编译时没有软浮动,你应该试试。