将两个目标文件链接在一起会导致分段错误11

时间:2016-09-26 02:40:09

标签: c linker segmentation-fault extern

我正在尝试使用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'用法出了问题。

另外,如果有人对链接器和装载器如何工作的好书有任何建议,我肯定是市场上的一个。我听说过“连接器和装载机”的混合物,所以在我特别投入时间之前,我还在等待更多的意见。

感谢您对此的任何帮助......至少可以说,我对链接器的理解不足。

1 个答案:

答案 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