【问题标题】:How to compile glibc for use without an operating system如何编译 glibc 以在没有操作系统的情况下使用
【发布时间】:2011-09-12 21:10:50
【问题描述】:
我想将 glibc 的函数编译成一个目标文件,然后该目标文件将链接到我在没有任何操作系统的计算机上运行的程序。某些功能,例如open,我想以ENOSYS 失败。其他函数我自己写,比如putchar,然后让glibc在它自己的里面使用这些函数(比如printf)。我还想使用不需要文件系统或进程管理系统或类似的功能,例如strlen。我该怎么做?
【问题讨论】:
-
如果您没有得到更好的答案,请查看EGLIBC 并在他们的邮件列表中询问。 (我不建议尝试从 GNU libc 维护者那里获得帮助...)
标签:
linker
compilation
glibc
【解决方案1】:
大多数 C 库都严重依赖内核,因此移植它们是不合理的。但是由于其中大部分不需要实现,因此您可以轻松地使用一些用于存根和 gcc 内置函数的原型。
您可以使用弱符号轻松实现存根:
#define STUB __attribute__((weak, alias("__stub"))) int
#define STUB_PTR __attribute__((weak, alias("__stub0"))) void *
int __stub();
void *__stub0();
然后定义原型变得微不足道:
STUB read(int, void*, int);
STUB printf(const char *, ...);
STUB_PTR mmap(void*, int, int, int, int, int);
实际功能可能是:
int __stub()
{
errno = ENOSYS;
return -1;
}
void *__stub0()
{
errno = ENOSYS;
return NULL;
}
如果您需要一些重要的功能,例如 printf,请从 uClibc 而不是 glibc(或其他一些较小的实现)中获取它。