【发布时间】:2022-06-10 18:41:59
【问题描述】:
我想阅读 systemd efi 存根的 .cmdline 部分(插入了 initramfs、内核和 cmdline)。
$ cp linux.efi x.efi
$ objcopy --dump-section .cmdline=/dev/stdout x.efi
root=UUID=a6a7b817-0979-46f2-a6f7-dfa191f9fea4 rw
$ cmp linux.efi x.efi
linux.efi x.efi differ: byte 217, line 2
$ objcopy --dump-section .cmdline=/dev/stdout x.efi /dev/null
root=UUID=a6a7b817-0979-46f2-a6f7-dfa191f9fea4 rw
bf1f56f197f2e457f4b9b7a0abc6fcc07aba9a3dbd8ea7objcopy: /dev/null: file truncated
$ ls -alh /dev/null
crw-rw-rw- 1 root root 1, 3 Jun 9 19:01 /dev/null
$ objdump -s -j .cmdline x.efi | awk -F' ' '{print $2}' | tr -d '\n'
root=UUID=a6a7b817-0979-46f2-a6f7-dfa191f9fea4 rw
7f4b9b7a0abc6fcc07aba9a3db
我认为第一个选项是最优雅的选项,但遗憾的是它修改了原始文件,从而破坏了安全启动。 第二个选项创建一个不需要的输出文件。使用 /dev/null 作为文件中断 /dev/null。所以之后需要创建和清理另一个文件(我认为这不是优雅的,因为它完全不需要)。 第三个选项尝试解析输出,但是当 cmdline 中有一个双空格时会出现严重问题。 (另外我认为这里不需要编写解析器)。
有没有优雅的解决方案? (就像告诉 objcopy 忽略输出文件)
您可以使用以下命令在 systemd 系统上创建示例文件:
objcopy --add-section .cmdline=<(echo -n "Test cmdline") /usr/lib/systemd/boot/efi/linuxx64.efi.stub x.efi
这里的.cmdline 输出应该是Test cmdline。
【问题讨论】:
-
请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。
-
您将无法使用
objcopy跳过生成文件。objdump -s -j .cmdline x.efi的输出是什么?你可能可以解析它 -
@Cyrus 我添加了一个例子。
-
@Fravadona 如上所述,我可以为它编写一个解析器,但我想要一个优雅/简单的解决方案。
标签: linux bash uefi objdump objcopy