Vinod Asked: 2025-02-13 09:51:49 +0800 CST2025-02-13 09:51:49 +0800 CST 2025-02-13 09:51:49 +0800 CST cc/gcc -R 标志到链接器 772 参考: 弱符号 在链接中提到了以下链接器选项: cc main.o -L`pwd` -Wl,-R`pwd` -lpowerslow -o main2 除 之外,所有上述标志的用途均已在 GCC 手册中记录-R。 这个标志指示链接器什么? 短暂性脑缺血发作 维诺德 gcc 2 个回答 Voted Best Answer telcoM 2025-02-13T13:53:29+08:002025-02-13T13:53:29+08:00 对于 GCC 来说,这只是一个选项,而不是两个: -Wl,-R`pwd` 该-Wl,<something>构造用于将<something>部分作为选项传递给链接器 ( ld)。在本例中,它指示gcc调用ld如下: ld -R`pwd` <other parameters...> 如果你看一下man ldLinux,你会发现(重点是我的): -R filename [...] 从 filename 中读取符号名称及其地址,但不重新定位它或将其包含在输出中。这允许您的输出文件以符号形式引用其他程序中定义的内存的绝对位置。您可以多次使用此选项。 为了与其他 ELF 链接器兼容,如果-R选项后面跟着目录名而不是文件名,则将其视为-rpath选项。 选项-rpath是: -rpath=dir 将目录添加到运行时库搜索路径。这在将 ELF 可执行文件与共享对象链接时使用。所有-rpath参数都连接起来并传递给运行时链接器,后者使用它们在运行时定位共享对象。[...] 因此整个构造的意思是“告诉运行时链接器在当前工作目录中搜索要链接的共享对象”。 手册ld页还指出: 该选项也可以在 SunOS 上使用。默认情况下,在 SunOS 上,链接器将从给出的-rpath所有选项中形成运行时搜索路径。如果使用某个选项,则运行时搜索路径将仅使用这些选项形成,而忽略选项。这在使用 gcc 时很有用,因为它添加了许多可能位于 NFS 挂载文件系统上的选项。-L-rpath-rpath-L-L 因此,此选项构造的总体目标是 cc -g -c -o main.o main.c cc -g -fpic -c -o power_slow.po power_slow.c cc -shared -fpic -o libpowerslow.so power_slow.po cc main.o -L`pwd` -Wl,-R`pwd` -lpowerslow -o main 是为了确保生成的main二进制文件仅在当前工作目录中搜索libpowerslow.so,因此它将选择第三个命令编译的精确版本,而不是libpowerslow.so系统其他地方可能存在的任何其他版本。 您应该意识到,虽然“烘焙”当前工作目录对于像这里构建的短暂示例二进制文件很有用,但是在构建要安装用于系统范围使用的东西时,您应该指定其他内容作为运行时库搜索路径。 icarus 2025-02-13T13:53:12+08:002025-02-13T13:53:12+08:00 来自ld手册页 -R filename --just-symbols=filename ..... For compatibility with other ELF linkers, if the -R option is followed by a directory name, rather than a file name, it is treated as the -rpath option. 这意味着可执行文件将把当前目录添加到运行时链接器搜索共享库的位置列表中,这将有助于它找到该powerslow库。 -rpath使用而不是会更不容易混淆-R。
对于 GCC 来说,这只是一个选项,而不是两个:
该
-Wl,<something>
构造用于将<something>
部分作为选项传递给链接器 (ld
)。在本例中,它指示gcc
调用ld
如下:如果你看一下
man ld
Linux,你会发现(重点是我的):选项
-rpath
是:因此整个构造的意思是“告诉运行时链接器在当前工作目录中搜索要链接的共享对象”。
手册
ld
页还指出:因此,此选项构造的总体目标是
是为了确保生成的
main
二进制文件仅在当前工作目录中搜索libpowerslow.so
,因此它将选择第三个命令编译的精确版本,而不是libpowerslow.so
系统其他地方可能存在的任何其他版本。您应该意识到,虽然“烘焙”当前工作目录对于像这里构建的短暂示例二进制文件很有用,但是在构建要安装用于系统范围使用的东西时,您应该指定其他内容作为运行时库搜索路径。
来自
ld
手册页这意味着可执行文件将把当前目录添加到运行时链接器搜索共享库的位置列表中,这将有助于它找到该
powerslow
库。-rpath
使用而不是会更不容易混淆-R
。