Linker 如何编译glibc以便在没有操作系统的情况下使用
我想把glibc的函数编译成一个目标文件,然后链接到一个我在没有任何操作系统的计算机上运行的程序。有些功能,如Linker 如何编译glibc以便在没有操作系统的情况下使用,linker,compilation,glibc,Linker,Compilation,Glibc,我想把glibc的函数编译成一个目标文件,然后链接到一个我在没有任何操作系统的计算机上运行的程序。有些功能,如open,我只想用ENOSYS失败。我将自己编写其他函数,如putchar,然后让glibc自己使用这些函数(如printf)。我还想使用不需要文件系统、流程管理系统或类似系统的功能,例如strlen。我如何做到这一点?大多数C库严重依赖内核,因此移植它们是不合理的。但是,由于大多数C库不需要实现,您可以轻松地获得一些存根和gcc内置的原型 您可以使用弱符号轻松实现存根: #define
open
,我只想用ENOSYS
失败。我将自己编写其他函数,如putchar
,然后让glibc自己使用这些函数(如printf
)。我还想使用不需要文件系统、流程管理系统或类似系统的功能,例如strlen
。我如何做到这一点?大多数C库严重依赖内核,因此移植它们是不合理的。但是,由于大多数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(或其他一些较小的实现)获取它。大多数C库严重依赖内核,因此移植它们是不合理的。但是,由于大多数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(或其他较小的实现)获取它。如果您没有得到更好的答案,请查看并询问他们的邮件列表。(我不建议尝试从GNULIBC维护人员那里获得帮助…)如果您没有得到更好的答案,请查看并询问他们的邮件列表。(我不建议尝试从GNULIBC维护人员那里获得帮助…)