zoukankan      html  css  js  c++  java
  • 链接器如何解析多重定义的全局符号(强弱符号)------深入理解计算机系统

    链接器如何解析多重定义的全局符号(不过我在vs2015 c++ 下发现并没有区分强弱符号,反正符号就是不能重定义。)

    1. 不允许有多个同名的强符号
    2. 如果有一个强符号和多个弱符号,那么选择强符号
    3. 如果有多个弱符号,那么从这些弱符号中任选一个
    //aa.c
    int x=1000;//强符号
    
    //bb.c
    int a;//弱符号
    所以此时选aa.c的强符号
    
    
    //cc.c
    int c;
    
    //dd.c
    int c;
    所以此时任选。
    

      规则2,3可能会造成一些问题,尤其是如果重复定义的符号定义还有不同的类型时。eg  x在一个模块中定义为int,在另一个模块中定义为double

    //aa.c
    
    int y=1;
    int x=456;
    
    
    //bb.c
    
    double x;
    void a()
    {
      x=-0.0;

      x86-64/linux上,double是8个字节,int 是4个字节。所以在我们系统中,x的地址是0x601020,y的地址是0x601024。(栈顶在上,方向向低地址)。因此,bb.c中的赋值x=-0.0将用负0的双精度浮点表示覆盖内存中x和y的位置。

    使用GCC-fno-common 标志,在遇到多重定义的全局符号时,触发一个错误。

    使用-Werror 标志。会把所有的警告变成错误。

  • 相关阅读:
    ssh 配置
    c指针
    centos 配置
    mac terminal 配色
    【webrtc】coturn服务搭建(27)
    【webrtc】SDP(26)
    【webrtc】webrtc通过peerconnection进行音视频互通(25)
    【webrtc】媒体协商的过程(24)
    【webrtc】STUN协议(23)
    【webrtc】webrtc网络传输基本知识(22)
  • 原文地址:https://www.cnblogs.com/l2017/p/10199259.html
Copyright © 2011-2022 走看看