Test 1
a.c
#include <stdio.h>
int a;
void fun(void)
{
a = 0x12345678;
printf("a.c:a=0x%x,sizeof(a)=%d\n",a,sizeof(a));
}
b.c
#include <stdio.h>
short a;
short b;
extern void fun(void);
int main(void)
{
a=0xaabb;
b=0x1122;
fun();
printf("b.c:a=0x%x,b=0x%x,sizeof(a)=%d,sizeof(b)=%d\n",a,b,sizeof(a),sizeof(b));
return 0;
}
编译:
gcc -c a.c -o a.o
gcc -c b.c -o b.o
gcc a.c b.c -o a.out
运行:
jintao@WS4CV3378K2G:~/test$ ./a.out
a.c:a=0x12345678,sizeof(a)=4
b.c:a=0x5678,b=0x1122,sizeof(a)=2,sizeof(b)=2
查看a.o中的符号表
查看b.o的符号表
查看a.out符号表
分析:a.c中的a和b.c中的a和b都是弱符号,如果一个符号在所有目标文件中都是弱符号,则链接的时候选择空间最大的那个,也就是最终链接的时候选择的是a.c中的int a;但是sizeof()和函数调用,以及变量赋值是在编译的时候决定的,所以b.c中的a,sizeof的大小是2;
Test 2
a.c
#include <stdio.h>
int x; //弱符号
void fun(void)
{
x=0x12345678;
printf("a.c:x=0x%x,sizeof(x)=%d\n",x,sizeof(x));
}
b.c
#include <stdio.h>
short x=0x10;//强符号
short y=0x20;//强符号
extern void fun(void);
int main(void)
{
fun();
printf("b.c:x=0x%x,y=0x%x,sizeof(x)=%d,sizeof(y)=%d\n",x,y,sizeof(x),sizeof(y));
return 0;
}
编译
gcc -c a.c -o a.o
gcc -c b.c -o b.o
gcc a.c b.c -o a.out
运行
jintao@WS4CV3378K2G:~/test/2$ ./a.out
a.c:x=0x12345678,sizeof(x)=4
b.c:x=0x5678,y=0x1234,sizeof(x)=2,sizeof(y)=2
查看a.o符号表
查看b.o符号表
查看a.out符号表
分析:a.c中的x是弱符号,占用4Bytes,b.c中的x y为强符号,占用2Byes,所以链接的时候选择了b.c中的强符号x和y,但是sizeof()和函数调用,以及变量赋值是在编译的时候决定的,最终x的链接地址为0x0000000000004010,y的地址为0x0000000000004012,编译的时候决定了从0x0000000000004010
开始写4Bytes,所以最终x=0x5678,y=0x1234。