如何读取加载程序中的自定义部分?

时间:2017-07-20 09:00:34

标签: c linux linux-kernel elf

我正在尝试在Linux的进程的可执行对象文件(Elf)中嵌入信息(一个简单的整数)。

我已经通过在文件中将整数值写为二进制文件,然后使用objcopy命令复制二进制文件内容来实现这一点。

objcopy --add-section .customsection=binaryfile processElfFile newProcessElfFile

通过这种方式,在newProcessElfFile中,我有一个完美的进程副本,其中包含一个包含整数值的新部分,我可以使用

查看该部分
readelf -e newProcessElfFile

我还通过在Libelf库上使用一些C代码验证了部分值是否正确。一切正常。

现在,我想读取新部分中包含的整数值,并在加载elf文件时执行printk。

为了实现这一点,我需要修改加载器代码,即内核端。

现在的问题是:

  • 我无法在使用libelf库的内核中编写代码,因此我无法像使用用户端程序那样直接访问section值。
  • 函数load_elf_binary()中包含在linux-VERSION / fs / binfmt_elf.c中的elf内核加载器不会读取elf节,而是访问elf程序头,这些头指向精灵段,而不是单个部分。

为了解决这个问题,我想我需要在一个细分中链接我的自定义部分,以便我可以访问它。

所以我有两个相关的问题:

  • 我可以以某种方式直接读取加载程序中的自定义部分吗?
  • 如果没有,我如何建立到自定义部分的段链接,以便我可以使用elf文件程序头来访问它?

另一种可能性是将整数值添加为已存在的.rodata部分的元素,但遗憾的是我不知道如何执行它以及如何访问内核中的该部分。

1 个答案:

答案 0 :(得分:4)

ELF标题(Elf32_EhdrElf64_Ehdr)包含指向节标题表(成员e_shoffe_shentsize)的信息。与段字符串表索引(e_shstrndx)一起,此信息可用于读取节标题并最终找到您感兴趣的数据。