-1

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

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

快速浏览一下,这很可能是一个选择。我想自动编译它是不可能的,所以有人可以给我一些关于汇编的信息吗?我只使用了基本的 ARM 程序集。我已经用-SGCC 中的标志编译成玩具函数。如何将寄存器与变量链接?它们会始终保持相同的顺序吗?该功能将得到高度优化。我应该什么时候开始和结束提取?我应该.cfi_startproc在开头和.cfi_def_cfa 7, 8结尾都包含吗?#

编辑 2: 这篇文章详细介绍了 gcc 如何使用-flto. 遗憾的是,这仅适用于 4.5 版,我没有也没有能力安装它,因为我没有需要在其上编译它的机器的 root 访问权限。另一种可能的解决方案是解释如何将不同版本的 GCC 安装到 unix 机器上的文件夹中。

4

2 回答 2

1

据我所知,gcc 不会进行链接时间优化(特别是内联),至少对于标准 ld 链接器(可能是新的黄金链接器会这样做,但我真的不这么认为)。Clang原则上应该能够做到这一点,因为它依赖于LLVM它支持链接时间优化(不过,您的问题似乎是 gcc 空间的)。

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

  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
于 2013-02-14T12:04:58.473 回答
-1

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

于 2013-02-13T23:58:27.113 回答