C语言强符号与弱符号

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。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KiranWang

一起努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值