当前位置: 首页 > article >正文

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

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.kler.cn/a/317312.html

相关文章:

  • Java 类型转换(Type Casting)
  • Go开发指南- Goroutine
  • JVM详解:类的加载过程
  • docker更改数据目录
  • 微信小程序中使用离线版阿里云矢量图标
  • 【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)
  • 网络分段:您需要了解的一切
  • ssh 免密登陆服务器故障
  • 免费在线压缩pdf 压缩pdf在线免费 推荐简单好用
  • 学习Vue3骨架+异步组件(defineAsyncComponent)+Suspense
  • Rust的初级学者课程和学习资源推荐
  • MyBatis-Mapper 接口与 XML 映射
  • NLP 主要语言模型分类
  • 项目实战:Qt+OSG爆破动力学仿真三维引擎测试工具v1.1.0(加载.K模型,子弹轨迹模拟动画,支持windows、linux、国产麒麟系统)
  • 鹏哥C语言43---函数的嵌套调用和链式访问
  • gin参数绑定panic错误分析
  • OpenCV特征检测(5)检测图像中的角点函数cornerMinEigenVal()的使用
  • 【TS】TypeScript基础入门篇以及实践案例
  • 中间件:maxwell、canal
  • Unity 高亮插件HighlightPlus介绍
  • Node.js backend for OpenAI image generation giving error code 400
  • Excel导入时,一个简单的匹配中文外键的方法
  • 防护装备穿戴与否检测系统源码分享
  • Vue.js Emit
  • 多旋翼无人机维修、组装、调试技术详解
  • typora使用和激活