当您用于cc(1)
链接程序时,它将调用默认的链接程序命令。例如,您的编译器版本可能已构建为在类似Unix的平台上默认使用/ usr / bin / ld。
有没有一种方法可以指定cc(1)
(或c++(1)
)应使用的另一个链接器命令(例如,/usr/local/bin/ld
代替/usr/bin/ld
)?我主要对gcc和clang感兴趣。
我不是在寻找涉及单独运行各个编译步骤的方法(例如,预处理,编译,汇编,链接)。
例如,我希望这样的事情可以完成这项工作:
env LD=/usr/local/bin/ld cc foo.c -o foo
Run Code Online (Sandbox Code Playgroud)
但这不适用于gcc或clang。当然,如果您有一个先生成目标文件的生成文件,然后调用$ {LD}进行链接(例如env LD=/usr/local/bin/ld make
),它将起作用
更新(有一种可能的动机):可以轻松地使用与默认链接程序不同的链接程序进行测试。例如,很高兴能够做到这一点:
cc --linker=/usr/local/bin/ld foo.c -o foo
Run Code Online (Sandbox Code Playgroud)
相反,您必须生成目标文件,运行cc -v
以找出的参数ld
,ld
并使用这些参数手动运行所需的参数:
cc -c foo.c
cc -v foo.c -o /dev/null
Run Code Online (Sandbox Code Playgroud)
现在查看链接器调用,并手动复制/粘贴替换链接器和临时目标文件。喜欢的东西,你这个替换(从测试在Fedora 23所采取的示例)/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/collect2
与/usr/local/bin/ld
(虽然它不是完全相同一样collect2
):
/usr/local/bin/ld -plugin /usr/libexec/gcc/x86_64-redhat-linux/5.3.1/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper -plugin-opt=-fresolution=/tmp/jhein/ccM2XKIg.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 …
Run Code Online (Sandbox Code Playgroud) 在我的〜/ .hgrc文件中设置特定设置之前,我可以检查mercurial的版本吗?例如,我想启用扩展(比如搁置扩展),但仅当hg版本是特定版本(例如2.8或更高版本)时.当一个人的主目录在安装了各种版本的hg的许多机器上共享(想想nfs)时,这尤其有用.