具有共享库支持的 Grub 引导加载程序

Posted

技术标签:

【中文标题】具有共享库支持的 Grub 引导加载程序【英文标题】:Grub bootloader with shared library support 【发布时间】:2014-10-13 08:07:14 【问题描述】:

我想在引导阶段使用 grub 引导加载程序加载一个共享库(闭源二进制用户空间库)。有没有这样的机会,或者我必须编写一个自定义elf-loader(grub模块)来做到这一点?


29/08/2014:有关详细信息,这是一个编程问题,我在其中 想要自定义或添加一些新功能到 Grub 引导加载程序 项目。感谢大家的支持!

【问题讨论】:

为什么不呢? @JonathonReinhart 作为 grub 标签上最多产的离题标记,我只想指出这个问题是 100% 的。 嘿,这刚刚重新打开,人们已经开始将其标记为离题。停止。这里完全是主题。 @unixsmurf 继续,在为时已晚之前回答。 @Powerlord 我同意这里有些模棱两可,但我不希望超级用户的答案是 “不。不可能。没有操作系统,没有 SO。”,而详细说明如何以编程方式实现它的答案在这里是可以想象的。 OP 谈到了一个自定义 ELF 加载器,所以他应该知道他在处理什么...... @powerlord - 不,这是一个简单的是/否问题 - 现有代码库是否可以支持这一点,或者他们是否需要从头开始构建自己的解决方案。 【参考方案1】:

因此,您并没有明确说明您要做什么,但是:

将用户空间(假设 Linux SysV ELF 类型)共享库直接加载到 GRUB 是不可能的。 GRUB 模块确实是 ELF 格式,但它们包含额外的标头。该标头中包含的信息是明确的许可声明 - GRUB 将拒绝加载任何未明确 GPLv2+、GPLv3 或 GPLv3+ 的模块。

应该可以编写 ELF 加载器,但更简单的方法可能是编写一个工具来将用户空间库转换为 GRUB 模块。这里当然会有一些限制:

您需要确保用户空间库不执行任何系统调用 - GRUB 将无法处理它们。 您需要遵守许可规则(因此只能接受三个以上的许可)。 您需要确保这些库不依赖于 glibc 为它们设置的全局偏移量表。

如果重新编译是一个选项,GRUB 还提供了一个 POSIX 仿真层 - 将 CPPFLAGS_POSIX 添加到您的 CPPFLAGS,并使用核心标准 POSIX 头文件。看看 gcrypt 支持的例子。

【讨论】:

哦,这很有趣(额外的标题)。很高兴您重新打开了该问题,以便您可以发布该信息。 谢谢@unixsmurf,你的回答真的很有帮助。我会根据您的想法通过一些实验来更新我的问题。再次感谢您。

以上是关于具有共享库支持的 Grub 引导加载程序的主要内容,如果未能解决你的问题,请参考以下文章

Linux共享库两种加载方式简述

使用预编译的C共享库与JNI / NDK

ctypes 加载具有依赖关系的 c 共享库

GCC 配置文件引导优化与共享库,无法控制可执行文件

如何在共享库中管理 spring-cloud 引导属性?

程序中动态加载共享库