linux - ELF 部分的标志是如何定义的?

标签 linux elf

使用readelf -S我们可以得到一个可重定位文件的所有部分的信息,但是我对flg的含义感到困惑。 在来自 Linux 内核的 elf.h 中 linux/elf.h :

/* sh_flags */    
#define SHF_WRITE       0x1
#define SHF_ALLOC       0x2
#define SHF_EXECINSTR       0x4
#define SHF_RELA_LIVEPATCH  0x00100000
#define SHF_RO_AFTER_INIT   0x00200000
#define SHF_MASKPROC        0xf0000000

但是我得到了

Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

那么其他的flags是怎么定义的呢?

最佳答案

不完全理解这个问题,但我相信您正在努力映射 readelf 和 Linux 内核定义。

所以基本上 readelf 是用户空间工具,这就是为什么它专注于用户空间 elf,它的部分比 lkm(可加载内核模块)更丰富。 这就是为什么您会看到比内核定义更多的模块标志,请参阅此处的“Section Attribute Flags”:http://www.sco.com/developers/gabi/2003-12-17/ch4.sheader.html

从其他站点来看,Linux 为 lkm 实现了一些功能,这些功能在用户空间中没有意义(好吧,也许它们可以,但它们在内核中)并且需要为部分添加额外的属性标志。

所以逐一进行:

SHF_RELA_LIVEPATCH:意味着这部分不是用于模块加载器,而是用于实时补丁,如果你看一下 module.c 代码,你可以看到在加载模块期间,加载器在应用重定位之前(即加载函数到内核空间)检查是否设置了此标志。如果设置了加载程序,则跳过此重定位。

SHF_RO_AFTER_INIT:“ro_after_init”功能的一部分。一种安全功能,在模块初始化后使用此标志将部分标记为只读。

如您所见,这两个标志都是特定于 Linux 内核的,这就是用户空间工具 readelf 无法理解它们的原因。但也许它应该而且是一个为这个工具编写自己的补丁的好地方;)

顺便说一句:在常量值之后的跟进,来自 livepatch 文档:

“根据 glibc 的定义,用于标记实时补丁符号和重定位部分的 Elf 常量是从特定于操作系统的范围中选择的。”

希望它能回答您的问题。

关于linux - ELF 部分的标志是如何定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45778183/

相关文章:

linux - Unix/Linux 命令向数字字符串添加 30 分钟

linker - 如何将文本文件的内容添加为 ELF 文件中的一个部分?

elf - ELF 中的 SHT_NULL 部分有什么用?

linux - ELF文件格式中的section和segment有什么区别

c - i386- Sprite -gcc : error: spawn: No such file or directory

elf - 在 elf 二进制文件中查找所有函数定义的方法

java - Windows 上的 Groovy URL UnknownHostException

linux - 如何编写 Linux 脚本以从单个可执行文件运行多个文件?

linux - 使用 $out 保存聚合结果,为什么这不起作用?

php - 对一个命令使用不同的 PHP 版本 CLI 可执行文件