GNU链接器(LD):什么是符号?符号定义及实例解析

server/2024/9/23 12:08:47/

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链接器脚本中符号所谓何物,以及符号的定义及实例解析。

2 GNU linker(链接器,LD):什么是符号符号定义及实例解析

2.1 什么是符号

符号在链接器脚本(.ld文件)中类似于C语言中的变量,不同的是链接器脚本中的符号不需要定义类型,符号长度固定为CPU支持寻址的字长,支持负数,但不支持小数。同时,符号不占用内存空间,仅在编译阶段为编译器所用。

2.2 符号定义及实例解析

除非给符号名加上引号,否则符号名必须以字母、下划线或句点(.)作为开头,可以包括字母、数字、下划线、句点(.)、连字符(-)。没有添加引号的符号名不能和链接脚本的任何关键字一致。非要使用的话可以使用双引号包围符号名,如下:

"SECTION" = 9;
"with a space" = "also with a space" + 10;

由于符号可以包括非字母的字符,为了避免混淆建议使用空格分隔符号。例如:

A-B 是一个符号
A - B 是一个减法操作

符号定义实例
链接脚本内定义了符号_TEST_symbol、._TEST-symbol2,值分别为-1、0xffffffff

_TEST_symbol = -1;
._TEST-symbol2 = 0xffffffff;

编译生成的.map文件内容如下:
在这里插入图片描述
.map文件找不到这2个符号分配的内存空间地址,说明符号是不占用内存空间的,只是在编译时使用。
假如我们在链接器脚本给符号赋值超过CPU寻址字长,会发生什么呢?

._TEST-symbol3 = 0x8888888811111111;

编译器不会报错,但打开.map文件可以看到符号只保留了CPU寻址字长能表示最大大小部分,超出部分直接被丢弃了:
在这里插入图片描述

假如我们在链接脚本内给符号赋值小数,会发生什么呢?

._TEST-symbol3 = 0.1;

可以看到链接器返回了一个错误:
在这里插入图片描述

假如我们不给符号赋初值,会发生什么呢?

._TEST-symbol3;

可以看到链接器返回了一个错误:
在这里插入图片描述

因此定义符号时需要严格遵守以下几点:
(1)必须要赋初值
(2)初值必须为整数(大小范围不能超过CPU寻址字长)


http://www.ppmy.cn/server/120792.html

相关文章

中国黑客技术即将失传!你敢学,我就敢教!

CSDN大礼包:👉《对标字节黑客&网络安全入门&进阶学习资源包》免费分享 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营…

C++容器list底层迭代器的实现逻辑~list相关函数模拟实现

目录 1.两个基本的结构体搭建 2.实现push_back函数 3.关于list现状的分析(对于我们如何实现这个迭代器很重要) 3.1和string,vector的比较 3.2对于list的分析 3.3总结 4.迭代器类的封装 5.list容器里面其他函数的实现 6.个人总结 7.代码附录 1.两…

第4步CentOS配置SSH服务用SSH终端XShell等连接方便文件上传或其它操作

宿主机的VM安装CENTOS文件无法快速上传,也不方便输入命令行,用SSH终端xshell连接虚拟机的SSH工具就方便多了,实现VM所在宿主机Win10上的xshell能连接vm的centos要实现以下几个环节 1、确保宿主机与虚拟机的连通性。 2、虚拟机安装SSH服务&…

【MySQL】—— mysqlcheck表维护程序

目录 (一)作用 (二)使用方法 (三)常用选项 (四)注意事项 (五)mysqlcheck的特殊说明 (一)作用 mysqlcheck 是 MySQL 数据库系统的一…

AI绘画Stable Diffusion:从新手到高手,漫画小说创收不是梦,几条视频变现几k(Ai工具+教程)

许多人都被大量的小说推文项目所淹没,看着别人收益高、账号做得好, 很多人讲述这个项目时,要么不透露具体AI工具名称, 要么不提供推文授权渠道,让人无从下手,干着急。 今天,向阳将带给大家一期…

云原生|浅谈云原生中的对象存储之MinIO 的使用

一、什么是对象储存 对象存储(Object Storage)以对象的形式存储和管理数据,这些对象可以是任何类型的数据,例如 PDF,视频,音频,文本或其他文件类型。对象存储使用分布式存储架构,数据…

python配置国内镜像源

windows系统配置python阿里云镜像源 C:\Users\97343\AppData\Local\Programs\Python\Python312使用命令查看配置文件位置 pip config -v listwindows下默认是没有 pip.ini 配置文件的,需新建,新建完之后写入以下内容 [Global] index-urlhttps://mirrors.aliyun.c…

SSCMS 插件示例 一插件创建及插件菜单

SSCMS 插件示例下载 1、工程创建过程,如下图所示。 2、工程路径和工程命名,如下图所示。 bjxingch作者 IPluginCUDR插件名称 3、选择框架,如下图所示。 4、使用NuGet安装 SSCMS和Datory,如下图所示。