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

GNU链接器(LD):PHDRS 命令用法及实例详解

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)链接器脚本中PHDRS 命令用法及实例详解。

2 GNU链接器(LD):PHDRS 命令用法及实例详解

2.0 PHDRS 命令功能介绍

ELF object文件会使用到program headers(程序头),也称作segments(段),这些程序头描述了程序如何被加载到存储器中。
在原生的ELF系统中运行ELF程序,系统加载器为了知道如何加载程序会读取程序头,前提是程序头被正确设置。链接器默认会创建合理的程序头,但有些情况下可能需要自己生成程序头使程序加载到存储器的操作更加准确。为了实现这一功能,链接器脚本内可以使用PHDRS命令创建程序头。
值得一提的是,链接器只在生成ELF输出文件时才关心PHDRS命令,其它时候直接忽略。

2.1 PHDRS 命令用法

PHDRS命令格式如下:

PHDRS
{name type [ FILEHDR ] [ PHDRS ] [ AT ( address ) ] [ FLAGS ( flags ) ];
}

说明:
(1)name,只用来给链接器脚本的 SECTIONS 命令引用,不会放到输出文件中。每个程序头都要有唯一的名字,程序头名称会被保存在隔离的名称空间里,不会和符号名、文件名以及分区名混淆。
(2)type,必须使用以下中的一个,数字表示关键字的值(可以用值替换关键字):
PT_NULL(0):未使用的程序头
PT_LOAD (1):此程序头描述一个从文件中加载的段
PT_DYNAMIC (2):包含动态链接信息的段
PT_INTERP (3):包含程序解释器名称的段
PT_NOTE (4):保存辅助信息的段
PT_SHLIB (5):保留的程序头类型,定义了,但未被 ELF ABI 指定
PT_PHDR (6):保存程序头的段
PT_TLS (7):保存线程本地存储的段
expression:一个数字的表达式,说明程序头的类型。用于上面未定义的类型
(3)FILEHDR、PHDRS,可以使用这2个关键字更多地描述段中的内容
(4)AT,可以加载段到存储器中特定的地址,这和在输出分区属性中的AT命令功能相似,且程序头的AT命令会覆盖输出分区AT属性
(5)FLAGS,链接器通常会根据组成段的分区来设置段标志。我们可以使用FLAGS关键字来显性指定段标志,flags的值必须是整型,用来设置程序报头中的 p_flags 域

2.2 PHDRS 实例详解

PHDRS
{text	PT_LOAD FLAGS(5);	/* READ and EXECUTE */data 	PT_LOAD FLAGS(6);	/* READ and WRITE */bss 	PT_LOAD FLAGS(6);	/* READ and WRITE */
}

说明:
text、data、bss的PT_LOAD属性告诉链接器这些段(.text段、.data段、.bss段)全都需要加载到存储器中。FLAGS(5)表示属性为可读可执行,FLAGS(6)表示属性为可读可写。


http://www.mrgr.cn/news/37213.html

相关文章:

  • 解决图片放大模糊
  • 多线程计算π
  • C语言 | Leetcode C语言题解之第440题字典序的第K小数字
  • LM393 电压比较器和典型电路
  • DSP——从入门到放弃系列——多核导航器(持续更新)
  • C++中的动态图形与音频同步:实现罗盘时钟与音乐播放器
  • Flask 本地测试完成,如何部署到网络上,买什么样的空间
  • HarmonyOS异常处理实践
  • VC++同时处理ANSI和Unicode字符集,除了使用TCHAR和_T()宏外,还有其他方法可以实现吗?
  • 基于51单片机的方向盘模拟系统
  • 【学习笔记】手写 Tomcat 七
  • 算法学习021 c++有多少张桌子 并查集算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析
  • TMR技术的发展及其应用技术的介绍
  • PDF 秒变 JPG,2024 这些工具来助力
  • 2024四川省赛 The 2024 Sichuan Provincial Collegiate Programming Contest补题记录
  • Java | Leetcode Java题解之第440题字典序的第K小数字
  • 增量式编码器实现原理
  • Materials - 基础视差原理
  • sysbench 命令:跨平台的基准测试工具
  • 秒懂Linux之信号