我试图弄清楚是否可以通过多个步骤将目标文件链接在一起,前提是"顺序"保留下来。 (或者,是否链接*是"关联"或不是)。
*我模糊地意识到链接脚本,弱符号和c之间存在一些微妙的联系。我很好奇在最简单的情况下,对于普通的" C项目,其中每个符号都是唯一的。
我有一个简单的项目,具有以下结构:
.
├── build.sh
├── child.c
├── child.h
├── grandparent.c
├── grandparent.h
├── main.c
├── parent.c
└── parent.h
使用以下脚本构建:
#!/bin/bash
# build objects
gcc -c -o grandparent.o grandparent.c
gcc -c -o parent.o parent.c
gcc -c -o child.o child.c
gcc -c -o main.o main.c
# link all at once
gcc -o main main.o grandparent.o parent.o child.o
此处child.h
int c_add();
child.c
#include "child.h"
int c_add(int x, int y) { return x + y; }
此处parent.c
#include "parent.h"
int p_add(int x, int y) { return c_add(x, y); }
和grandparent.c
#include "grandparent.h"
int gp_add(int x, int y) { return p_add(x, y); }
(parent.h
和grandparent.h
是child.h
)
我试图弄清楚是否可以通过三个步骤将项目的四个目标文件链接在一起,如下所示(草编语法):
$ combine-objfile -o bar.o parent.o child.o
$ combine-objfile -o foo.o main.o grandparent.o
$ gcc -o main foo.o bar.o
其中combine-objfile
是一个假设的实用程序,它将whatever-format-a-.o-的两个文件组合到另一个相同格式的文件中,满足相同的不变量(并允许引用尚未定义的符号)
如果答案是特定于平台的,我对x86 Linux最感兴趣。
答案 0 :(得分:1)
“链接”是从一个或多个目标文件构造可执行文件的过程。原则上可以组合多个目标文件,使得某些符号无法解析,但是,对于第一个近似,结果不是可执行文件,因此在这种情况下您所做的不是链接。
实际上,通常不会将多个目标文件组合成单个,单一的,不可执行的目标文件。相反,一个人建立库。确实可以逐步向库中添加对象,但构建系统通常不会这样做,因为它不是很有用。相反,如果想要一个库,通常会先构建所有将进入它的对象,然后从中构建库。有时,这涉及将一个库的内容添加到另一个库,但很少涉及将对象添加到现有库。
答案 1 :(得分:1)
是的,有可能。它可能不是数学意义上的联想,但你可能并不真的需要它。
macOS和Linux链接命令(ld
)有一个开关-r
,表示链接到新的目标文件而不是可执行文件。