0

我有一个在 armv7a Cortex-A9 CPU 上编译的 ELF。它在那里运行良好,没有任何问题,但是当它移到 armv7a Cortex-A8 CPU 上时,文件会静默退出,如下所示:

casey@arm:~/Unreal/System$ ./UCCLinux.bin.orig casey@arm:~/Unreal/System$

我构建了自己的 UCCLinux.bin,它使用了Cortex A9 CPU未更改的共享对象,并且执行工作正常。这让我相信共享对象没有问题,但 ELF 本身有问题。但是,区分 ld --verbose/readelf 只显示了一个很小的差异。在我构建的版本上,它需要不同的依赖项。ld-linux-armhf.so.3,因为它不存在并替换为 libm.so.6;我有。

工作系统上还有一个让我困惑的搜索路径:SEARCH_DIR("/usr/armv7hl-suse-linux-gnueabi/lib") armv7* h *l, with no hf on gnueabi。我不确定这是否意味着 SuSE 在 Ubuntu 上构建的任何内容,因为它们都是硬浮动的,它可能只是语义。

两个系统上的 ldd 输出都与原始文件匹配。除了对该依赖项的更改和一些相对较小的评论(可能来自不同发行版上的不同编译器)之外,我完全不知所措。

我有我构建的文件和给我的文件的 strace 输出。

好: http: //pastebin.com/ef8Svn1Q

不好: http: //pastebin.com/04fyP5xt

我完全不知道为什么会发生这种情况,因为我尝试的所有其他小型测试程序都可以完美运行。出于某种原因,这只是一个文件。使用 mtune=cortex-a8 进行的编译并没有改变任何东西,如果我们必须分发带有“哦顺便说一句,你必须编译自己的二进制文件才能运行它”的构建,那将是一个彻底的失败。另外,我怀疑这可能会出现一些潜在的问题。

相关的{据我所知}编译器选项:

-march=armv7-a -mtune=cortex-a9 -mfloat-abi=hard -mfpu=vfpv3-d16

FPU 匹配两个 cpu,并且都是 hardfloat armv7a。

有任何想法吗?

编辑:发现了一些关于 Valgrind 的新信息。

-1929-- 从 /home/casey/Unreal/System/UCCLinux.bin.orig (0x8000) 读取 syms --1929-- 从 /lib/arm-linux-gnueabi/ld-2.15.so (0x4000000) 读取 syms - -1929-- 考虑 /lib/arm-linux-gnueabi/ld-2.15.so .. --1929-- .. CRC 不匹配(计算的 c6793f6a 需要 66aab705)--1929-- 对象没有符号表

valgrind:启动时出现致命错误:函数重定向 valgrind:对于此平台工具组合是必需的 valgrind:无法设置。重定向的详细信息是: valgrind:必须重定向的函数 valgrind:其名称与模式匹配:memcpy valgrind:在具有 soname 匹配的对象中:ld-linux.so.3 valgrind:在处理时未找到 valgrind:符号来自带有 soname 的对象:ld-linux.so.3

我的发行版同时具有 hardfloat 和 softfloat 库,尽管我认为它们是互斥的。

4

0 回答 0