相当大的共享库(许多模板实例化)的LTO构建需要相当长的时间(> 10分钟).现在我知道了关于库的一些事情,并且可以以对象文件的形式指定某种"黑名单",这些文件不需要一起分析(因为它们之间没有应该内联的调用),或者我可以指定应该一起分析的目标文件组.这可能是某种方式(没有拆分lib)?
/有一个很少使用的功能ld,可以用来将多个目标文件组合成一个,然后可以链接到最终产品中。如果可以让 LTO 在这里发生,但不能稍后发生,那么您就可以获得您正在寻找的那种“部分”LTO。-r--relocatable
遗憾的ld -r是行不通;它只是组合所有要稍后处理的 LTO 信息。但通过 gcc 驱动程序 ( gcc -r) 调用它似乎可以工作:
交流电
Run Code Online (Sandbox Code Playgroud)int a() { return 42; }公元前
Run Code Online (Sandbox Code Playgroud)int a(void); int b() { return a(); }抄送
Run Code Online (Sandbox Code Playgroud)int b(void); int c() { return b(); }直流电
Run Code Online (Sandbox Code Playgroud)int c(void); int main() { return c(); }
$ gcc -O3 -flto -c [a-d].c
$ gcc -O3 -r -nostdlib a.o b.o -o g1.o
$ gcc -O3 -r -nostdlib c.o d.o -o g2.o
$ gcc -O3 -fno-lto g1.o g2.o
$ objdump -d a.out
...
00000000000004f0 <main>:
4f0: e9 1b 01 00 00 jmpq 610 <b>
...
0000000000000610 <b>:
610: b8 2a 00 00 00 mov $0x2a,%eax
615: c3 retq
...
Run Code Online (Sandbox Code Playgroud)
因此main()优化为return b();,并b()优化为return 42;,但两组之间没有过程间优化。
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |