【问题标题】:UNIX: Cannot find file or directory after cross-compiling a binary that uses shared object filesUNIX:交叉编译使用共享对象文件的二进制文件后找不到文件或目录
【发布时间】: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


【解决方案1】:

其实我最近发现了这个问题。

问题是我使用的是 Eclipse。我使用的第三方库文件以“libSHAREDFILENAME.so”格式命名。 Eclipse 在设置要在 IDE 中使用的库时不太喜欢这样。它希望您从文件名中去掉“lib”和“.so”部分。所以一个名为“libSHAREDOBJECT.so”的文件在 Eclipse 中应该被引用为“SHAREDOBJECT”。它不喜欢“lib”前缀或“.so”后缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-20
    • 2018-03-07
    • 2011-04-07
    • 2020-02-07
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多