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