GNU链接器(LD):PROVIDE、PROVIDE_HIDDEN关键字介绍

ops/2024/10/11 0:39:01/

0 参考资料

GNU-LD-v2.30-中文手册.pdf
GNU linker.pdf

1 前言

一个完整的编译工具链应该包含以下4个部分:
(1)编译器
(2)汇编器
(3)链接器
(4)lib库
在GNU工具链中,对应的是:
(1)编译器:GCC(GNU Compiler Collection,GNU编译器套件)
(2)汇编器:GAS(GNU Assembler,GNU汇编器)
(3)链接器:LD(GNU Linker,GNU链接器
(4)lib库:glibc(GNU C Library,GNU C 库)
本文介绍GNU链接器LD)链接器脚本的PROVIDEPROVIDE_HIDDEN关键字。

LDPROVIDEPROVIDE_HIDDEN_18">2 GNU链接器LD):PROVIDEPROVIDE_HIDDEN关键字介绍

PROVIDEPROVIDE_HIDDEN_19">2.1 PROVIDEPROVIDE_HIDDEN关键字

在某些情况下,链接器脚本想要实现类似于__weak关键字的功能,也就是没被链接过程中任何object文件定义且符号被引用时,符号定义才会生效。
举个例子,传统链接器定义了exext符号,而ANSI C需要把etext当做一个函数名使用且不报错。PROVIDE关键字就可以用来定义符号etext,只有当它被引用且ANSI C未定义才生效。语法如下:

PROVIDE(symbol = expression)

以下是一个使用 PROVIDE 定义 etext 的例子:

SECTIONS
{.text :{*(.text)_etext = .;PROVIDE(etext = .);}
}

在这个例子中,如果程序重定义了_etext(下划线开头),链接器会提示重定义错误(和链接脚本的_etext符号重复了)[实测并不会报告错误]。而如果程序定义etext(不以下划线开头),链接器会使用程序中的定义。如果引用了etext但没有定义它,链接器就会使用在链接器脚本中的定义。
PROVIDE_HIDDEN关键字功能和PROVIDE关键字类似。
实测即使重复定义也不会报告错误(可能新版链接器取消了这种情况下的报错):
链接脚本中的定义:
在这里插入图片描述
C中的定义:
在这里插入图片描述
编译没有报错:
在这里插入图片描述


http://www.ppmy.cn/ops/123728.html

相关文章

VAD 论文学习

VAD: Vectorized Scene Representation for Efficient Autonomous Driving 解决了什么问题?相关工作感知运动预测规划 提出了什么方法?概览1. 矢量化的场景学习矢量化地图交通参与者的矢量化运动 2. Planning via Interaction自车-其它交通参与者的交流自…

macOS .bash_profile配置文件优化记录

文章目录 说明原文件内容优化思路优化操作测试验证1. 验证JAVA_HOME2. 验证MAVEN_HOME3. 验证MONGODB_HOME4. 验证CLASSPATH5. 验证PATH 说明 展示的代码中,关于具体的文件路径位置,请灵活修改为自己的真实文件目录! 原文件内容 从macOS C…

R语言绘制面积图

面积图是一种数据可视化图表。它通过填充区域来展示数据随某个变量(如时间)的变化趋势及累积效果。面积图能清晰地呈现数据的上升、下降和波动情况,直观反映数据的大小关系。适用于多种领域,如经济数据分析展示 GDP 变化及产业贡献…

Redis-主从复制

分布式系统,涉及到一个非常关键的问题:单点问题 如果某个服务器程序,只有一个节点,就会出现: 可用性问题(这个服务器挂了,服务中断)性能/支持的并发量有限 引入分布式系统,主要也是为了解决上述的单点问题 在分布式系统中,希望有多个服务器来部署redis服务,从而构成一个red…

论文阅读笔记-Are Pre-trained Convolutions Better than Pre-trained Transformers?

前言 Transformer诞生到现在,从NLP领域到CV领域,可以说是两开花。特别是在预训练模型中,BERT相关系列近些年屡屡突破,在各种下游任务中,不仅能提速还有效果上的提升。所以在NLP的相关任务中,提及Transformer和CNN时,Transformer一般都会优先考虑,更何况是在预训练语言…

YOLOv8实战工地安全帽检测【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对工地安全帽数据集进行训练和优化,该数据集包含丰富的安全帽图像样本…

【C++网络编程】(一)Linux平台下TCP客户/服务端程序

文章目录 Linux平台下TCP客户/服务端程序服务端客户端相关头文件介绍 Linux平台下TCP客户/服务端程序 图片来源:https://subingwen.cn/linux/socket/ 下面实现一个Linux平台下TCP客户/服务端程序:客户端向服务器发送:“你好,服务…

Git 工作区、暂存区和仓库

在使用 Git 进行版本控制时,工作区、暂存区和仓库概念的详细解释: 1. 工作区(Working Directory) 工作区是你在计算机上实际编辑文件的地方。当你克隆一个 Git 仓库或在现有目录中初始化一个 Git 仓库时,这个目录就是…