如何链接未被使用的符号

如何链接未被使用的符号

我们知道,在ld链接静态库过程中,通常只有被使用到的符号才回被链接进可执行文件中。

而在某些场景中,我们希望在链接的时候也能把未使用的符号也给链接进来。

在ext/mylib.h文件中声明了一个add函数和一个Register对象

#pragma once#include<iostream>int add(int a, int b);class Register {
public:Register() {std::cout<<"Register constructor : "<<this<<std::endl;// register}~Register() {}
};

在ext/mylib.cc文件中定义了add函数和一个Register静态实例

#include"mylib.h"int add(int a, int b) {return a + b;
}static Register r;

将上述文件编译成静态链接库mylib.a

在hello.cc中我们引入了mylib.h头文件,现在的问题是Register的构造函数会被调用吗?


#include"ext/mylib.h"int main() {return 0;
}

第一种情况,我们虽然引入mylib.h文件,但是没有调用任何mylib中的符号。执行的结果是:


什么也没有输出,Register没有被调用,说明Register符号并没有被链接进来。

第二种情况,我们引入mylib.h文件,并且调用add函数:


#include"ext/mylib.h"int main() {add(5,23);return 0;
}

编译运行,结果是:

Register constructor : 0x7ff8e85890e1

Register的构造函数被调用了,说明Register符号被链接进来了。

于是可以得出第一个结论,静态链接以.o文件为单位的。也就是说,在一个.o文件中,只要其中一个符号被链接进来,剩下的符号也会被链接进来(哪怕是没有被使用的)。

–whole-archive参数

如果我们没有引用链接库中的符号,但又想将这些符号链接进来怎么办?

可以使用ld链接器的一个参数:–whole-archive。具体在CMakeList中可以这么写:

target_link_libraries(my_exe -Wl,--whole-archive mylib -Wl,--no-whole-archive)

这里面需要注意的–whole-archive后面是想要全量链接的库名,之后要使用–no-whole-archive避免后面的库也全量链接。

还有一个问题,如果只想链接一个.o文件中被使用的符号,而把其它未被使用的符号删去,应该怎么做?

可以使用-ffunction-sections -fdata-sections参数生成.o文件,链接的时候再加上-Wl,–gc-sections参数。

上述实验仅针对静态链接,动态链接待研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DistributedDataParallel数据不均衡

背景 在使用 DistributedDataParallel 进行数据并行训练时&#xff0c;每次反向传播都需要执行 all_reduce 操作以同步各个进程的梯度。all_reduce 需要进程组中的所有进程参与&#xff0c;如果某一个进程没有执行 all_reduce&#xff08;一个进程的输入较其他进程少&#xff…

软件测试(五)自动化 selenium

文章目录 自动化测试单元测试&#xff1a;单元测试&#xff1a;UI自动化 selenium工具定义特点&#xff1a;原理&#xff1a;seleniumjava环境搭建SeleniumAPI获取测试结果&#xff1a;添加等待浏览器操作键盘事件鼠标事件多层框架/窗口定位下拉框处理弹窗处理上传文件操作关闭…

Unity Editor 打包指定资源(AssetBundle)和加载指定资源

前言&#xff1a; 一般用于ui资源打包和加载&#xff0c;代码比较简单没什么好说的&#xff0c;直接上代码。 打包代码&#xff1a; [MenuItem("Assets/打包指定的预设")]public static void BuildAsset() {var selectObject Selection.activeObject;if (selectObje…

怎样才能去除视频中的背景音乐,保留人声?

做视频剪辑&#xff0c;二次创作的朋友&#xff0c;需要去除视频中的背景音乐&#xff0c;保留人声&#xff1b;或者去除人声&#xff0c;保留背景音乐。如果请身边做视频的朋友帮忙&#xff0c;可有时不能沟通到位&#xff0c;完成后的效果并不是很理想&#xff0c;就很尴尬了…

26. 通过 cilium pwru了解网络包的来龙去脉

pwru是一种基于eBPF的工具,可跟踪Linux内核中的网络数据包,并具有先进的过滤功能。它允许对内核状态进行细粒度检查,以便通过调试网络连接问题来解决传统工具(如iptables TRACE或tcpdump)难以解决甚至无法解决的问题。在本文中,我将介绍pwru如何在不必事先了解所有内容的…

低代码助力软件开发

低代码开发工具正在日益变得强大&#xff0c;它正不断弥合着前后端开发之间的差距。对于后端来说&#xff0c;基于低代码平台开发应用时&#xff0c;完全不用担心前端的打包、部署等问题&#xff0c;也不用学习各种框架&#xff08;Vue、React、Angular等等&#xff09;&#x…

Mysql中的RR 隔离级别,到底有没有解决幻读问题

Mysql 中的 RR 事务隔离级别&#xff0c;在特定的情况下会出现幻读的问题。所谓的幻读&#xff0c;表示在同一个事务中的两次相同条件的查询得到的数据条数不一样。 在 RR 级别下&#xff0c;什么情况下会出现幻读 这样一种情况&#xff0c;在事务 1 里面通过 update 语句触发当…

一款简单漂亮的WPF UI - AduSkin

前言 经常会有同学会问&#xff0c;有没有好看简单的WPF UI库推荐的。今天就给大家推荐一款简单漂亮的WPF UI&#xff0c;融合多个开源框架组件&#xff1a;AduSkin。 WPF是什么&#xff1f; WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windo…

大模型基础——大模型范式

大模型背后的范式 整个预训练语言模型的使用范式&#xff1a; 对于预训练模型&#xff0c;最核心的要素是从无标注的数据中去学习&#xff0c;通过自监督的一些任务去做预训练&#xff0c;得到丰富的知识。在具体的应用中&#xff0c;会引入一些任务相关的数据&#xff0c;去调…

C++学习之多态详解

目录 多态的实现 例题 重载 重写 重定义的区别 抽象类 多态实现原理 多态的实现 C中的多态是指&#xff0c;当类之间存在层次结构&#xff0c;并且类之间是通过继承关联时&#xff0c;就会用到多态。多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执…

万能DIY预约小程序源码系统 上门预约服务小程序搭建 适用于各种预约场景 自由DIY功能模块

在这个快节奏的时代&#xff0c;预约服务已经成为了我们日常生活的一部分。从看病挂号到餐厅预订&#xff0c;从美发美容到家政服务&#xff0c;预约已经深入到了各个领域。然而&#xff0c;传统的预约方式存在着许多不便&#xff0c;如电话预约、在线填写表格等&#xff0c;不…

MyBatis Generator - 快速生成 实体类 和 映射文件

目录 一、MyBatis Generator 的使用 1.1、生成类和映射文件 1.1.1、在 pom.xml 中引入依赖 1.1.2、根据 configurationFile 标签中配置的路径 创建 generatorConfig.xml 文件 1.1.3、自动生成类 和 映射文件 1.1.4、在 Insert 标签中添加获取主键值的选项 1.1.5、扫描配置…

Linux编译器-gcc/g++使用函数库

【Linux】系列文章目录 【Linux】基础常见指令&#xff1a;http://t.csdn.cn/hwLPb 【Linux】基本权限&#xff1a;http://t.csdn.cn/faFZg 【Linux】软件包管理器yum与环境开发工具vim&#xff1a;http://t.csdn.cn/LEqkm 目录 【Linux】系列文章目录 前言 一、gcc选项总…

Android Update Engine 分析(二十四)制作降级包时,到底发生了什么?

文章目录 0. 导读1. 关于升级和降级的本质2. Android 如何制作降级包?3. Android 降级流程全追踪1. 使用 "--downgrade" 选项制作降级包2. OPTIONS.downgrade = True 选项3. OPTIONS.wide_user_data = True 选项4. 制作差分包对时间戳的检查5. 总结6. 思考题7. 其它…

Arthas(阿尔萨斯):阿里巴巴开源的线上问题诊断工具

背景 通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。 开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同…

[C++]类型转换

一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与 接收返回值类型不一致时&#xff0c;就需要发生类型转化。 C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换和显式…

VMware克隆虚拟机

VMware克隆虚拟机&#xff1a; https://blog.csdn.net/wisdom_futrue/article/details/128553427

python astra相机驱动问题

报错问题&#xff1a; openni.utils.OpenNIError: (OniStatus.ONI_STATUS_ERROR, bDeviceOpen using default: no devices found, None) 解决办法&#xff1a; 1、从sdk中拷贝文件 2、修改openni源码 3、执行测试程序 from openni import openni2 import numpy as np impor…

python中多行注释与取消注释

在小白学习python编程的过程中&#xff0c;我们经常会发现很多同学们喜欢问的一个问题&#xff1a; 怎么多行注释呢&#xff1f; 怎么取消多行注释呢&#xff1f; 以上种种问题我相信来到这里都会得到相应答案 那我们接下来开始吧&#xff01; 文章目录 单行注释多行注释取消多…

day4:Node.js 核心库

day4:Node.js 核心库 文章目录 day4:Node.js 核心库常用工具模块util 模块Moment 模块Lodash 模块web模块文件模块path 模块常用工具模块 Node.js有许多常用的工具,以下是一些常见的: util: 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心 JavaScript 的功能…