zoukankan      html  css  js  c++  java
  • 链接装载和库读书笔记 在动态库中尽量少使用全局变量,要使用请加上static

    测试代码:

    super@super-desktop:~$ cat lib.h
    #ifndef _LIB_H
    #define _LIB_H

    void lib_func();

    #endif
    super@super-desktop:~$ cat lib.c
    #include <stdio.h>

    int super_a = 0;

    void lib_func()
    {
        printf("A is: %d\n", super_a);
        return;
    }
    super@super-desktop:~$ cat main.c
    #include <stdio.h>
    #include "lib.h"

    int super_a = 0;

    int main()
    {
        super_a = 100;
        lib_func();
        printf("A in main is: %d\n", super_a);
        return 0;
    }

    输出:

    super@super-desktop:~$ gcc -shared -fPIC -g -o liblib.so lib.c
    super@super-desktop:~$ gcc -o main main.c -L. -llib
    super@super-desktop:~$ ./main
    A is: 100
    A in main is: 100

    解释:

    动态共享库编译的时候,对于全局变量,一律视为模块间变量访问。变量会通过数据段的GOT表来访问。而且,当可执行文件中(由于可执行文件不是PIC的)有同名全局变量时,共享库中定义的变量会被ignore,进程中只会存在可执行程序中的super_a。

    所以,编写动态库的时候,尽量少用全局变量,如果要用,请加上static,这样就不会有问题。

    参考链接装载和库的P198 -- 共享模块的全局变量问题。

    BTW:如果是静态链接,链接会失败报错 -- multiple definition of super_a。

     

  • 相关阅读:
    python 上传下载文件
    post方式加载iframe
    js 实现打印功能
    python 判断数据类型
    web样式无法正常显示
    C# 调用python
    PDF转换成Txt
    js预览PDF的插件(亲测支持IE9,火狐,等等)
    文件下载
    asp.net网站发布到服务器GET的技能
  • 原文地址:https://www.cnblogs.com/super119/p/2254413.html
Copyright © 2011-2022 走看看