gcc / -Wl,-Bsymbolic
一、问题
在动态库中含有全局变量 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相关推荐
- gcc -Wl,--wrap,malloc 替换系统函数
GNU链接器就提供了一个好用的方法: –wrap=symbol 函数名为"__wrap_symbol",且称其为包装函数,"symbol"是一个函数名,大致执行 ...
- gcc / -Wl,--as-needed、 -Wl,--no-as-needed
一.说明 gcc 提供了 -Wl,--as-needed 和 -Wl,--no-as-needed 两个选项,这两个选项一个是开启特性,一个是取消该特性. 在生成可执行文件的时候,通过 -lxxx 选 ...
- [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...
- gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...
- GCC详解的-Wl选项说明
在GCC编译程序时,由于GCC命令不经能够编译,也能够链接程序,GCC链接程序是通过ld命令实现的,如何将GCC的命令行参数传递给ld命令呢,这就是通过-Wl,来实现的. 格式如下: gcc -Wl, ...
- GCC详解的-Wl选项说明与测试
在GCC编译程序时,由于GCC命令不仅能够编译,也能够链接程序,GCC链接程序是通过ld命令实现.那如何将GCC的命令行参数传递给ld命令呢.通常在编译时通过使用-Wl这个选项来实现的. 测试例程 测 ...
- GCC详解-gcc之-Wl选项
1.介绍 -Wl后面的东西是作为参数传递给链接器ld的.比如: gcc -Wl,aaa,bbb,ccc 最后会被解释为: ld aaa bbb ccc 2.-Wl,-Map=xxx.txt 生成map ...
- -Bsymbolic:优先使用本地符号
问题描述 前段时间项目开发中,实现了一个动态库,封装了一些方法.然后基于这个动态库,实现了一个应用程序.应用程序中含有全局变量A,动态库中也含有全局变量A,当我调用动态库中函数后,发现应用程序的A发生 ...
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题
如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...
最新文章
- Android应用程序进程启动过程的源代码分析(2)
- Linux下matlab断点调试
- 如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语
- Nginx作为静态资源web服务
- spring ref historydesign philosophy
- 民间75个不传之密 ,医院都不知道的秘密
- NPS内网穿透服务端一键安装脚本
- SQL查询语句中的 limit offset(转 )
- 在没有创建Provision Profile权限的情况下 发布Enterprise inhouse app 的方法
- html5播放倍速,[html5]html5倍速播放功能源代码实例
- Unity3D内存释放
- 两个很棒的爬虫智能解析库,通配大部分网页!
- 供应链金融的产品业务系统应用架构设计
- H3C防火墙基础配置1-登录配置、安全域配置
- 从零开始的iOS开发:10 | 如何构建一个APP
- GetFirmwareEnvironmentVariable失败返回错误码1314
- 学而滑稽之,不亦君子乎
- ICML 2020 | SCAFFOLD:联邦学习的随机控制平均
- UML介绍及怎么看UML图
- 计算机学院十四五工作规划,计算机学院举行教学指导委员会成立暨十四五规划修订会议...