美文网首页
强弱符号的问题

强弱符号的问题

作者: wayyyy | 来源:发表于2021-03-05 15:51 被阅读0次

// fun.c

#include <stdio.h>
void func()  
{
    printf("func\n");
}

// mian.c

#include <stdio.h>
void func()
{
    printf("func\n");
}
int main(void)
{
    func();
    return 0;
}

gcc main.c fun.c

/tmp/ccxn0naT.o: In function `func':
main.c:(.text+0x0): multiple definition of `func'
/tmp/ccgZJUf1.o:fun.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status

平常会遇到一种错误就是重定义的问题,这个问题本质上是强弱符号的问题。

强符号和弱符号

编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。

int num1;        // 未初始化全局变量,弱符号
int num2 = 10;   // 已初始化全局变量,强符号
void func()      // 函数强符号
{
    printf("func\n");
}

但是我们也可以用__attribute__((weak))来修饰,将一个强符号转换为弱符号。

__attribute__((weak)) int num2 = 2222;  // 使用标识修饰的弱符号
  • 当强弱符号出现同名时,链接器怎么选择?
    • 强符号不允许重复
    • 有一个强符号和多个弱符号,使用强符号
      #include <stdio.h>
      
      int num1;        // 未初始化全局变量,弱符号
      int num1 = 10;   // 已初始化全局变量,强符号
      
      int main()
      {
          printf("func: %d\n", num1);    // 输出10
      }
      
    • 多个弱符号,随意选择一个
利用强弱符号规则制作插件

实现一个类似插件的功能:

  • 当没有插件时,使用默认行为
  • 链接了插件时,使用插件的功能
// main.c

#include <stdio.h>
__attribute__((weak)) void foo();

void test()
{
    // 如果是强符号,说明链接了外部插件,使用外部定义
    if (foo)
    {
        foo();
    }
    else
     // 弱符号,走默认逻辑
    {
        printf("foo\n");
    }
}

int main()
{
    test();
}

制作插件库:

// plugin.c

#include<stdio.h>

void foo()
{
    printf("plugin foo\n");
}
$ gcc -c plugin.c -o plugin.o
$ ar -rcs libplugin.a plugin.o

链接插件库:

# gcc -o main main.c -L. -Wl,--whole-archive -lplugin -Wl,--no-whole-archive
# ./main
  plugin foo 

这里需要加上-Wl,--whole-archive,该选项会将插件库中所有符号都链接进来,若非如此,在main.o中已经有了foo符号,将不会链接进来,而在此之后,又要将该选项恢复。最终我们可以通过nm命令看到foo符号已经不再是W了。

相关文章

  • 强弱符号的问题

    // fun.c // mian.c gcc main.c fun.c 平常会遇到一种错误就是重定义的问题,这个问...

  • 强弱符号与强弱引用

    强弱符号与强弱引 概念 就C/C++而言: 强符号(Strong Symbol):已初始化的全局变量。 弱符号(W...

  • UML类图

    解析UML类图符号意义 各种关系的强弱顺序 依赖<关联<聚合<组合<实现 == 泛化

  • 最专业的强弱电基础知识讲解,讲得很细!

    本篇介绍了建筑强弱电的基础知识,介绍了三相交流用电、导线种类、照明安装方式、导线敷设符号、线路图形符号、配电设备图...

  • 合唱团网课笔记

    Q:气息问题:拍子的强弱是靠气息的强弱来掌握吗? A:唱歌时拍子的强弱,虽然与气息有关,但主要是靠音量来控制。 练...

  • UML

    关系有:关联、依赖、组合、聚合、实现、泛化强弱排序:组合>聚合>关联>依赖符号表示:关联:实体箭头依赖:虚体箭头组...

  • S3-1.2 声音的特征

    一、响度 声音的强弱叫做响度。 响度决定于声源振动的幅度,还与距离声源的远近有关。 分贝是声压级的大小单位(符号:...

  • 7.2符号方法与符号系统

    7.1传统语言学问题 7.1.1符号的价值、能指、所指 7.1.2符号的任意性与线性 7.2符号方法与符号系统 本...

  • 能断金刚14

    【第十四周问题】 一、在本章中所学习的所有影响铭印(种子)强弱程度的因素? 1、动机,决定铭印强弱程度最重要的因素...

  • 7.1.1符号的价值、能指、所指

    7.符号系统 7.1传统语言学问题 7.1.1符号的价值、能指、所指 我们已经了解索绪尔的符号观点:‘语言符号是所...

网友评论

      本文标题:强弱符号的问题

      本文链接:https://www.haomeiwen.com/subject/dsebaktx.html