C:将预编译的代码编译为内联

时间:2013-02-13 23:46:03

标签: c gcc inlining lto

由于一些相当复杂的原因,我有一组文件,我想单独编译然后链接,但所以一个中的函数放在第二个内联。这是因为我希望它们在GCC中使用不同的标志进行编译。我知道我可以通过研究如何解决这个问题来解决问题,但我想知道这是否可行。

编辑1: 如果没有,是否可以将“外部”函数编译成我可以包含在另一个文件中的汇编形式。是疯了但也很酷......

快速浏览一下,这可能是一个选择。我想这是不可能自动编译的,所以有人可以给我一些关于汇编的信息吗?我只使用了基本的ARM组件。我在GCC中使用-S标志编译为玩具函数。如何将寄存器与变量链接?他们总是在同一个顺序吗?该功能将得到高度优化。我什么时候应该开始和结束提取物?我应该在开始时加.cfi_startproc,在结尾加.cfi_def_cfa 7, 8吗?#

编辑2: This post详细说明了gcc如何使用-flto进行此类链接时优化。遗憾的是,这只适用于4.5版,我没有,也没有能力安装,因为我没有机器的root访问权限,我需要编译它。另一个可能的解决方案是解释如何在unix机器上的文件夹中安装不同版本的GCC。

2 个答案:

答案 0 :(得分:1)

据我所知gcc不做linktime optimizations(特别是内联),至少使用标准的ld链接器(可能是新的gold链接器做了它,但我真的不这么认为)。 Clang原则上应该能够做到这一点,因为它取决于LLVMwhich supports link time optimizations(似乎你的问题是gcc spacific)。

从您的问题来看,似乎您正在寻找一种在编译后合并目标文件的方法,而不一定是通过内联其包含的函数。这可以通过多种方式完成:

  1. 使用ar:将它们存档到静态库中,例如: ar libfoo.a obj1.o obj2.o
  2. 将它们组合成第三个可重定位对象(ld的--relocatable选项)。 gcc -Wl,--relocatable -o obj3.o obj1.o obj2.o
  3. 将它们放入共享库(请注意,这需要使用-fPIC编译对象),例如gcc -shared -o libfoo.so obj1.o obj2.o

答案 1 :(得分:-1)

您可以使用-c选项进行编译以创建一组.o文件,甚至可以创建.so文件。然后在gcc的链接阶段使用你喜欢的序列。