我正在为一个新架构的LLVM后端工作,我们需要有位置无关的可执行文件。我可以通过' -fPIE'在clang命令行上,但我没有看到任何迹象表明这个显示在最终的LLVM IR中。例如,如果我运行:
clang -v -emit-llvm -fPIC -O0 -S global_dat.c -o global_dat_x86_pic.ll
然后看看生成的global_dat_x86_pic.ll文件,我在底部附近看到以下内容:
!0 = !{i32 1, !"PIC Level", i32 2}
好的,有道理。
但是,如果我跑:
clang -v -emit-llvm -fPIE -O0 -S global_dat.c -o global_dat_x86_pie.ll
我看到两个.ll文件是相同的。在global_cat_x86_pie.ll的底部附近,我看到:
!0 = !{i32 1, !"PIC Level", i32 2}
这与我使用-fPIE运行的情况相同。没有迹象表明" PIE等级"在.ll文件中。如果这个.ll文件被传递给llc怎么会知道-cPIE已经在clang命令行上设置了?
我已经在gdb中运行了,实际上在第二种情况下,在clang命令行上使用了-fPIE,有一个Opts.PIELevel(在$ LLVM_HOME / tools / clang / lib / Frontend / CompilerInvocation.cpp中)到2(实际上,在这种情况下,Opts.PIELevel和Opts.PICLevel都设置为2,而在-fPIC中只传递给clang,Opts.PICLevel设置为2)
答案 0 :(得分:0)
这取决于您的默认目标三元组,我无法从您的问题中得知。您可以看到如果切断默认架构会发生什么(或者在支持PIE的拱门上运行本机clang)
例如,裸X86-64显示了这个,
$ clang -c hello.c -target x86_64 -fPIE -emit-llvm -###
如果你运行该命令,你会在输出中找到"-pie-level" "2"
,这就是llc
(嗯,它的内部等价物)知道它的方式。
这里的关键是你必须安排你的后端用这个标志做点什么。某些平台(如达尔文)只是忽略它。如果您正好在OSX主机上进行实验,那么您将无法在bogbrush输出中看到-pie-level
。