背景介绍
Section 是 Linux ELF 程序格式的一种核心数据表达方式,用来存放一个一个的代码块、数据块(包括控制信息块),这样一种模块化的设计为程序开发提供了很大的灵活性。
需要增加一个功能,增加一份代码或者增加一份数据都可以通过新增一个 Section 来实现。Section 的操作在 Linux 内核中有着非常广泛的应用,比如内核压缩,比如把 .config 打包后加到内核映像中。
下面介绍三种新增 Section 的方式:汇编、C 和 ELF 工具。
通过内联汇编新增一个 Section
如何创建一个可执行的共享库 中有一个很好的例子:
代码语言:javascript复制asm(".pushsection .interp,"a"n"
" .string "/lib/i386-linux-gnu/ld-linux.so.2"n"
".popsection");
通过上述代码新增了一个 .interp
Section,用于指定动态链接器。简单介绍一下这段内联汇编:
asm
括号内就是汇编代码,这些代码几乎会被“原封不动”地放到汇编语言中间文件中(hello.s)。- 这里采用
.pushsection
,.popsection
,而不是.section
是为了避免之后的代码或者数据被错误地加到这里新增的 Section 中来。 .pushsection .interp, "a"
,这里的 "a" 表示 Alloc,会占用内存,这种才会被加到程序头表中,因为程序头表会用于创建进程映像。.string
这行用来指定动态链接器的完整路径。
稍微延伸两点:
.string
可以替换为.incbin file
,然后把字符串内容放到名为 file 的文件中。文件末尾记得改为