一、问题

在动态库中含有全局变量 A,在应用程序中也使用了全局变量 A,这个时候在应用程序中修改全局变量 A 的时候也会修改动态库中的 A。如何不修改呢?

在创建动态链接库时,gcc / g++ 选项中添加编译选项:

-Wl,-Bsymbolic

二、栗子

main.c

#include "tool.h"
#include <stdio.h>int i = 100;int main() {printf("main,i = %d\n",i);printData();return 0;
}

tool.h

void printData();

tool.c

#include "tool.h"
#include <stdio.h>int i = 0;void printData() { printf("tool,i = %d\n", i); }

CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
set(TARGET_NAME main)
set(LIB_TARGET_NAME tmp)set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")project(${TARGET_NAME} LANGUAGES C CXX)add_library(${LIB_TARGET_NAME} SHARED tool.c)add_executable(${TARGET_NAME} main.c)target_link_libraries(${TARGET_NAME} PRIVATE${LIB_TARGET_NAME})

执行下面命令:

cmake . -Bbuild

cmake --build build

./build/main

结果:

main,i = 100
tool,i = 100

可以发现,库中代码执行了可执行程序中的全局变量的定义。

如果加上 -Wl,-Bsymbolic,即:

cmake_minimum_required(VERSION 3.8)
set(TARGET_NAME main)
set(LIB_TARGET_NAME tmp)set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Bsymbolic")project(${TARGET_NAME} LANGUAGES C CXX)add_library(${LIB_TARGET_NAME} SHARED tool.c)add_executable(${TARGET_NAME} main.c)target_link_libraries(${TARGET_NAME} PRIVATE${LIB_TARGET_NAME})

结果:

main,i = 100
tool,i = 0

从结果可以发现,加上 -Wl,-Bsymbolic 之后,库中嗲嘛强制采用本地的全局变量的定义。

(SAW:Game Over!)

gcc / -Wl,-Bsymbolic相关推荐

  1. gcc -Wl,--wrap,malloc 替换系统函数

    GNU链接器就提供了一个好用的方法: –wrap=symbol 函数名为"__wrap_symbol",且称其为包装函数,"symbol"是一个函数名,大致执行 ...

  2. gcc / -Wl,--as-needed、 -Wl,--no-as-needed

    一.说明 gcc 提供了 -Wl,--as-needed 和 -Wl,--no-as-needed 两个选项,这两个选项一个是开启特性,一个是取消该特性. 在生成可执行文件的时候,通过 -lxxx 选 ...

  3. [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解

    背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...

  4. gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解

    背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...

  5. GCC详解的-Wl选项说明

    在GCC编译程序时,由于GCC命令不经能够编译,也能够链接程序,GCC链接程序是通过ld命令实现的,如何将GCC的命令行参数传递给ld命令呢,这就是通过-Wl,来实现的. 格式如下: gcc -Wl, ...

  6. GCC详解的-Wl选项说明与测试

    在GCC编译程序时,由于GCC命令不仅能够编译,也能够链接程序,GCC链接程序是通过ld命令实现.那如何将GCC的命令行参数传递给ld命令呢.通常在编译时通过使用-Wl这个选项来实现的. 测试例程 测 ...

  7. GCC详解-gcc之-Wl选项

    1.介绍 -Wl后面的东西是作为参数传递给链接器ld的.比如: gcc -Wl,aaa,bbb,ccc 最后会被解释为: ld aaa bbb ccc 2.-Wl,-Map=xxx.txt 生成map ...

  8. -Bsymbolic:优先使用本地符号

    问题描述 前段时间项目开发中,实现了一个动态库,封装了一些方法.然后基于这个动态库,实现了一个应用程序.应用程序中含有全局变量A,动态库中也含有全局变量A,当我调用动态库中函数后,发现应用程序的A发生 ...

  9. Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...

最新文章

  1. Android应用程序进程启动过程的源代码分析(2)
  2. Linux下matlab断点调试
  3. 如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语
  4. Nginx作为静态资源web服务
  5. spring ref historydesign philosophy
  6. 民间75个不传之密 ,医院都不知道的秘密
  7. NPS内网穿透服务端一键安装脚本
  8. SQL查询语句中的 limit offset(转 )
  9. 在没有创建Provision Profile权限的情况下 发布Enterprise inhouse app 的方法
  10. html5播放倍速,[html5]html5倍速播放功能源代码实例
  11. Unity3D内存释放
  12. 两个很棒的爬虫智能解析库,通配大部分网页!
  13. 供应链金融的产品业务系统应用架构设计
  14. H3C防火墙基础配置1-登录配置、安全域配置
  15. 从零开始的iOS开发:10 | 如何构建一个APP
  16. GetFirmwareEnvironmentVariable失败返回错误码1314
  17. 学而滑稽之,不亦君子乎
  18. ICML 2020 | SCAFFOLD:联邦学习的随机控制平均
  19. UML介绍及怎么看UML图
  20. 计算机学院十四五工作规划,计算机学院举行教学指导委员会成立暨十四五规划修订会议...

热门文章

  1. java制作闪星星_Silverlight之我见——制作星星闪烁动画
  2. 《SEO的艺术(原书第2版)》——2.6 垂直搜索引擎
  3. 数学建模写作时相关的套路
  4. 一起谈.NET技术,.NET十年(下)
  5. RGB YUV的来历及相互转换
  6. 【夏目鬼鬼分享】RabbitMQ路由模式
  7. 7-14 然后是几点 (15分)
  8. 【尚硅谷HTML5】前端HTML代码笔记
  9. arttemplate+ajax 转 vue
  10. 《把时间当作朋友》 - 书评