Chinaunix
标题:
发现一个奇怪的gcc连接现象
[打印本页]
作者:
qtdszws
时间:
2008-12-03 10:02
标题:
发现一个奇怪的gcc连接现象
1.c
#include <stdio.h>
char *s="hello world!\n";
void f()
{
printf(s);
}
复制代码
2.c
#include <stdio.h>
char *t="abc\n";
void g()
{
printf(t);
}
复制代码
3.c
void f();
int main()
{
f();
}
复制代码
gcc -c 1.c -o 1.o
gcc -c 2.c -o 2.o
gcc -c 3.c -o 3.o
gcc 1.o 2.o 3.o -o 11
objdump -dj .text 11//11包含g,虽然没有用到
ar rv test.a 1.o 2.o
gcc 3.o test.a -o 22//不能gcc test.a 3.o -o 22,报错,f未定义
objdump -dj .text 22//22不包含g
4.c
#include <stdio.h>
char *s="hello world!";
void f()
{
printf(s);
}
char *t="abc";
void g()
{
printf(t);
}
void *u="12345";
复制代码
gcc -c 4.c -o 4.o
ar rv test.a 4.o //不报错
gcc 3.o test.a -o 33
./33//会发现连接1.o中的f
ar rv test2.a 4.o
gcc 3.o test2.a -o 44
objdump -dj .text 44//发现f,g都在44中
objdump -sj .rodata 44/发现s,t,u也都在44中
因此似乎可以得出以下结论
1.gcc命令行中的所有目标文件都会被放入可执行文件,即使没有用到
2.gcc的命令行中文件是有顺序的,库文件要在后面
3.gcc连接是以目标文件为单位的,如果使用了目标文件中的函数和变
量,该目标文件将全部被连接到可执行文件中
4.ar库文件只区分目标文件名,而不管其中的名称是否冲突
5.gcc在ar库中顺序查找需要解析的名称在哪个目标文件中,找到就连
接该目标文件
作者:
cjaizss
时间:
2008-12-03 11:07
我把你的程序改一改,你再试试.
1.c
#include <stdio.h>
char *s="hello world!\n";
extern char *s1;/*新加的*/
void f()
{
printf(s);
printf(s1);/*新加的*/
}
复制代码
2.c
#include <stdio.h>
char *t="abc\n";
char *s1="s1\n";/*新加的*/
void g()
{
printf(t);
}
复制代码
3.c
void f();
int main()
{
f();
}
复制代码
作者:
qtdszws
时间:
2008-12-03 11:14
你想测试什么? 是不是某条结论有问题?
作者:
cjaizss
时间:
2008-12-03 11:17
你可以看看,两个的现象应该是不一样的
作者:
qtdszws
时间:
2008-12-03 11:19
>>两个的现象应该是不一样的
还是不明白你的意思,什么现象?
作者:
cjaizss
时间:
2008-12-03 11:21
你的结论没什么问题
作者:
cjaizss
时间:
2008-12-03 11:21
链接以目标文件为单位,所以链接库的时候发现g也在里面.
作者:
prolj
时间:
2008-12-03 11:58
gnu toolchain还不完善,贡献代码是有难度的。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2