我正在尝试使用externs和各种链接方法来更好地理解链接过程。
我有三个文件:
foo.c的:
#include "foo.h"
int a = 4;
test.c的:
#include <stdio.h>
#include "foo.h"
int main(int, char**);
int mymain();
int mymain() {
main(0, 0);
printf("test\r\n");
return 0;
}
int main(int argc, char** argv) {
printf("extern a has %d\r\n", a);
return 0;
}
foo.h中:
extern int a; // defined in foo.c
如果我一起构建每个文件并在编译时使用gcc链接:
gcc *.c -o final.bin
我可以执行final.bin:
./final.bin
并获得预期的输出
extern a has 4
但是,如果我分别编译(但不链接)test.c和foo.c,那么尝试在运行时链接目标文件以生成二进制文件,我得到一个分段错误11(从我的内容可以收集的是一些通用的内存损坏错误,就像普通的段错(?)
这是我用来编译和链接的makefile。注意我指定自己的入口点并链接libc以获取printf()...
all: test.o foo.o
@echo "Making all..."
ld test.o foo.o -o together.bin -lc -e _mymain
test.o: test.c
@echo "Making test..."
gcc -c test.c -o test.o
foo.o: foo.c
@echo "Making foo..."
gcc -c foo.c -o foo.o
运行'together.bin'时的输出:
./together.bin
extern a has 4
test
Segmentation fault: 11
也许我的'mymain'功能签名错了?我的猜测是我的'myentry'用法出了问题。
另外,如果有人对链接器和装载器如何工作的好书有任何建议,我肯定是市场上的一个。我听说过“连接器和装载机”的混合物,所以在我特别投入时间之前,我还在等待更多的意见。
感谢您对此的任何帮助......至少可以说,我对链接器的理解不足。
答案 0 :(得分:0)
除非你有充分的理由这样做,否则只需使用gcc链接:
0000
1000
0000
0100
1100
1110
0110
0010
1010
1011
0011
0111
1111
1101
0101
0001
1001
gcc调用ld ---但是,你的例子中提供的参数多于你提供的参数。如果您想确切知道gcc如何调用ld,请使用$ gcc test.o foo.o "-Wl,-e,_mymain" -o ./final.bin; ./final.bin
extern a has 4
test
选项。例如:
-v