我在哪里可以找到 arm-linux-gnueabihf-ld 的联机帮助页,更不用说包含 -rpath 和 -rpath-link 的编写良好的联机帮助页了?
Posted
技术标签:
【中文标题】我在哪里可以找到 arm-linux-gnueabihf-ld 的联机帮助页,更不用说包含 -rpath 和 -rpath-link 的编写良好的联机帮助页了?【英文标题】:Where can I find a manpage for arm-linux-gnueabihf-ld, let alone a well-written one, that includes -rpath and -rpath-link? 【发布时间】:2016-05-27 15:19:00 【问题描述】:我在我的 ELF 文件上运行了 arm-linux-gnueabihf-ldd(一个来自 Cygwin——别问——一个来自 Ubuntu),尽管通过包含 -rpath- 消除了 Ubuntu 上的警告链接,我认为是动态依赖静态,考虑到我阅读它的难以捉摸的联机帮助页的模糊性,dll 仍然显示 ld-linux.so.3 作为 5 个未解决的之一,但链接器从未抱怨其他四个!在这种情况下,路径是指向通过 apt-get 安装的本地副本。
这种浪费时间导致主机抱怨“未找到”(这意味着,正如我后来发现的那样,找到了 ELF 文件,但没有找到未命名的库)。主机在 /lib 中具有大部分这些而在 /usr/lib 中具有其余部分的事实使我认为 -rpath 和/或 -rpath-link 应该告诉它在主机上的何处查找它们的分辨率,好像主机不够聪明,不知道它把库放在哪里。
我不是在寻找任何比简单的 arm-linux-gnueabihf-ld 选项(或扩展为 arm-linux-gnueabihf-g++ 选项)足够清晰的“更高级别”(即更不透明)的东西在他们的使用中,并且不会引起如下消息:
arm-linux-gnueabihf-g++: error: unrecognized command line option ‘-rpath’
arm-linux-gnueabihf-g++: error: unrecognized command line option ‘-rpath’
当我知道它在不同的上下文中识别“-rpath”时,它抱怨它在构建机器上找不到对主机无用的路径!
【问题讨论】:
您的意思是ld
还是ldd
?
ldd 是用于查找需要动态库的未解析外部的实用程序。
我知道这一点,但您在标题中写了一个,而在问题的正文中使用了另一个。
【参考方案1】:
你试过man ld
吗?
完整的文档在binutils manual,您可以使用info ld
阅读。
-rpath-link,我认为它使动态依赖成为静态
不,它告诉链接器在哪里找到间接共享库依赖项,因此它可以检查它们以确保没有未解析的引用。
。主机在 /lib 中具有大部分这些而在 /usr/lib 中具有其余部分的事实使我认为 -rpath 和/或 -rpath-link 应该告诉它在主机上的何处查找它们的分辨率
没有。
-rpath
添加可执行文件的路径,以便在运行时动态加载器将在该路径中查找共享库依赖项在运行时。这是指定共享库路径的一种方法,长为ldconfig
、LD_LIBRARY_PATH
等(详见ld.so(8))。
-rpath-link
告诉链接器在链接时在哪里查找共享库依赖项,但不影响在运行时如何找到依赖项。
您不能将-rpath
传递给g++
,因为它是链接器的一个选项,而g++
不理解它。使用-Wl,-rpath
告诉g++
将其传递给链接器。
【讨论】:
即使使用 -Wl,"-rpath /lib" -Wl,"-rpath /usr/lib" 它仍然会抱怨,但是应该使用等效的 -Wl,"-R /lib" -Wl ,"-R /usr/lib" (它也接受没有 -Wl,)它没有。它只是构建了一个同样无用的 ELF,缺少通往动态库的路径,与以往一样。 投诉如下:/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin /ld: bad -rpath option collect2: error: ld returned 1 exit status 由于在解析静态链接时缺少前瞻逻辑,问题是否与位置相关? 原来问题出在 arm-linux-gnueabihf-ldd 的输出(我是从 Cygwin 运行的,因为 Ubuntu 安装不包含它,也无法通过 apt 找到它) -file),我至少通读了 3 遍,显示找不到 ld-linux-armhf.so.3,我终于意识到这不是 ld-linux.so.3,所以我创建了一个软链接,现在获取 /lib/libc.so.6:未找到版本“GLIBC_2.15”。最后一条消息至少告诉了我一些有用的东西! 你做错了。使用这些选项的正确方法是-Wl,-rpath,/lib
,即在引号内使用逗号而不是空格。或-Wl,rpath -Wl,/lib
(阅读man gcc
)。它抱怨-Wl,"-rpath /lib"
,因为-rpath /lib
不是ld
的有效选项(它必须是两个选项)。带有"-R /lib"
的版本创建了一个`/lib` 的rpath,即带有一个前导空格,它永远不会匹配任何东西。但是您不需要为 /usr/lib 设置 rpath,因为无论如何 ld.so 总是在那个位置查找。以上是关于我在哪里可以找到 arm-linux-gnueabihf-ld 的联机帮助页,更不用说包含 -rpath 和 -rpath-link 的编写良好的联机帮助页了?的主要内容,如果未能解决你的问题,请参考以下文章