使用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/