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

devtools/2024/9/24 15:54:36/

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/devtools/116572.html

相关文章

Java工厂模式

简单工厂模式 工厂模式 抽象工厂模式 超级工厂模式 容器工厂模式 工厂模式为了返回一个对象,但是尽量不通过规范的User user new User()的方式,而是通过一些简单的名字、xml、注解或者其他来返回对象。就像一个人可能有很多东西,他的灵…

数据结构 ——— 算法的空间复杂度

目录 前言 空间复杂度的概念 利用例题讲解空间复杂度 例题1: 例题2: 例题3: 结论 前言 在前几章学习了算法的时间复杂度并且练习了时间复杂度的相关代码 数据结构 ——— 算法的时间复杂度-CSDN博客 接下来要学习的是时间的空间复杂…

C++速通LeetCode中等第12题-矩阵置零(空间O(1)含注释)

class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int m matrix.size();int n matrix[0].size();int flag_col0 false, flag_row0 false;//先记录第一行和第一列是否有零for (int i 0; i < m; i) {if (!matrix[i][0]) {flag_col…

等保测评:企业如何建立安全的开发环境

等保测评与安全开发环境的建立 等保测评是中国信息安全等级保护制度的重要组成部分&#xff0c;它要求企业对信息系统进行安全等级划分&#xff0c;并进行全面的安全评估和测试。企业在建立安全的开发环境时&#xff0c;应遵循等保测评的要求&#xff0c;确保开发过程中的信息…

一款能够管控企业计算机的安全系统 | 企业终端安全管控 | 天锐DLP数据安全

天 锐 DLP可帮助企业规范对电脑计算机的使用管理&#xff0c;对USB存储设备、终端外节设备、桌面壁纸进行统一管控&#xff0c;支持限制控制面板、计算机管理、系统下的相关功能选项的使用。 【地址&#xff1a;点击了解天锐股份数据安全产品】 1.计算机设置 天锐DLP可对计算…

WPF 控件数据源绑定

WPF 控件数据源绑定 前提&#xff1a;我的数据源都放在 DataProcessView 类中&#xff0c;然后在 MainWindow 中声明该类的对象 DataProcess&#xff0c;如果是指定了 DataContext &#xff0c;就将该对象赋值给 DataContext &#xff08;如下&#xff09;&#xff0c;否则不赋…

Fyne ( go跨平台GUI )中文文档-绘图和动画(三)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

2017年国赛高教杯数学建模C题颜色与物质浓度辨识解题全过程文档及程序

2017年国赛高教杯数学建模 C题 颜色与物质浓度辨识 比色法是目前常用的一种检测物质浓度的方法&#xff0c;即把待测物质制备成溶液后滴在特定的白色试纸表面&#xff0c;等其充分反应以后获得一张有颜色的试纸&#xff0c;再把该颜色试纸与一个标准比色卡进行对比&#xff0c…