如何编译glibc以便在没有操作系统的情况下使用

时间:2011-06-11 00:19:46

标签: linker compilation glibc

我想将glibc的函数编译成目标文件,然后将其链接到我在没有任何操作系统的计算机上运行的程序。某些功能,例如open,我想用ENOSYS失败。我将自己编写的其他函数,例如putchar,然后让glibc使用它们自己的那些函数(如printf)。我还想使用不需要文件系统或进程管理系统的功能或类似的功能,例如strlen。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

大多数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(或其他一些较小的实现)中获取它。