Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linker 如何编译glibc以便在没有操作系统的情况下使用_Linker_Compilation_Glibc - Fatal编程技术网

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

Linker 如何编译glibc以便在没有操作系统的情况下使用,linker,compilation,glibc,Linker,Compilation,Glibc,我想把glibc的函数编译成一个目标文件,然后链接到一个我在没有任何操作系统的计算机上运行的程序。有些功能,如open,我只想用ENOSYS失败。我将自己编写其他函数,如putchar,然后让glibc自己使用这些函数(如printf)。我还想使用不需要文件系统、流程管理系统或类似系统的功能,例如strlen。我如何做到这一点?大多数C库严重依赖内核,因此移植它们是不合理的。但是,由于大多数C库不需要实现,您可以轻松地获得一些存根和gcc内置的原型 您可以使用弱符号轻松实现存根: #define

我想把glibc的函数编译成一个目标文件,然后链接到一个我在没有任何操作系统的计算机上运行的程序。有些功能,如
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维护人员那里获得帮助…)