使用readelf -S
我们可以获取有关可重定位文件的所有部分的信息,但是,我对flg的含义感到困惑。
在Linux内核的linux/elf.h的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)
那么如何定义其他标志?
答案 0 :(得分:0)
不能完全理解这个问题,但是我相信您正在努力映射readelf和Linux内核定义。
因此,readelf基本上是用户空间工具,这就是为什么它着重于用户空间elf的原因,该用户空间elf的部分比lkm(可加载内核模块)的部分丰富。 这就是为什么您看到的模块标志多于内核定义的原因,请参见此处的“部分属性标志”:http://www.sco.com/developers/gabi/2003-12-17/ch4.sheader.html
在另一个站点上,Linux为lkm实施了一些功能,这些功能在用户空间中没有意义(好的也许可以,但是它们在内核中),并且需要为部分提供附加的属性标志。
所以一步一步来:
SHF_RELA_LIVEPATCH:这部分不是用于模块加载器,而是用于实时补丁,如果您看一下module.c代码,您会发现在加载模块期间,加载器在应用重定位之前(即将函数加载到内核空间)检查是否设置了此标志。如果设置为loader,则跳过此重定位。
SHF_RO_AFTER_INIT:“ ro_after_init”功能的一部分。一种安全功能,在模块初始化之后,使用此标志“只读”标记各节。
如您所见,这两个标志都是特定于Linux内核的,这就是为什么用户空间工具readelf无法理解它们的原因。但是也许应该并且是为该工具编写自己的补丁的好地方;)
BTW:来自livepatch文档的常量值之后的跟踪:
“根据glibc的定义,从特定于操作系统的范围中选择了用于标记实时补丁符号和重定位部分的Elf常数。”
希望它能回答您的问题。