【发布时间】:2013-09-29 19:14:01
【问题描述】:
我能够成功交叉编译可以在 ARM 系统(如 Rasberry Pi)上运行的二进制文件。在没有链接到第三方库的情况下,正常的 C++ 代码可以在设备上成功运行(即 cout
我遇到的问题是,当我在与第三方库链接后运行可执行文件时,我收到标准 UNIX 错误“没有这样的文件或目录”。当二进制文件尝试访问共享对象文件时。我将它要查找的文件复制到 usr/lib 文件夹、usr/local/lib 文件夹以及可执行文件所在的文件夹中。
此外,我还为 LD_LIBRARY_PATH 添加了一个很好的值,以便运行时链接器可以在这些位置进行搜索。我的猜测是“系统”可能会从可执行文件中隐藏这些文件?
为了添加更多信息,我对二进制文件和共享对象文件运行了 readelf 命令,它为我提供了文件的正确描述。它告诉我二进制文件是一个 32 位文件,并且需要我提到它找不到的这个共享对象库文件。即使在构建阶段的链接时间,我也会添加以下链接器命令 -Wl,-rpath,以设置查找共享对象文件的位置。请注意,我是在 Macintosh 机器上编译,而不是在 Rasberry Pi 本身上编译。因此交叉编译。
我觉得这是一个设置,因为目标文件在多个位置可见/有效。如果有人以前经历过这种情况,请提供任何建议。提前致谢。
【问题讨论】:
-
我自己没有遇到这些问题 - 可能是由于我的设置有限,但只是一些想法:我将从 strace'ing 应用程序开始。这应该告诉您可执行文件本身是否失败 - 因为动态加载发生在应用程序内部(afaik - 有人可能会纠正我)如果找不到库,它将显示在跟踪中。如果 strace 无法跟踪应用程序,那么这应该意味着内核无法正确加载应用程序,这可能仅意味着(假设它是正确的可执行类型)链接器(用于 INTERP 信息的 readelf 文件)无法按指定找到按可执行文件。
-
@pBlack 你用的是哪个工具链?
-
我在发布这篇文章时使用的是“arm-none-linux-gnueabi-*”。它在 Mac 上,我找到了可以安装和使用的 DMG 映像。目前虽然我在这里为 Cubie Board 使用 Linaro 工具链:google.com/…
标签: arm cross-compiling