我有兴趣使用 Linux 头文件提供的 unistd.h 构建一个没有 (g)libc 的静态 ELF 程序。
我已经阅读了这些文章/问题,这些文章/问题大致了解了我正在尝试做的事情,但并不完全是:http: //www.muppetlabs.com/~breadbox/software/tiny/teensy.html
https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free
我有仅依赖于 unistd.h 的基本代码,其中,我的理解是这些函数中的每一个都是由内核提供的,并且不需要 libc。这是我采取的似乎最有希望的道路:
$ gcc -I /usr/include/asm/ -nostdlib grabbytes.c -o grabbytesstatic
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400144
/tmp/ccn1mSkn.o: In function `main':
grabbytes.c:(.text+0x38): undefined reference to `open'
grabbytes.c:(.text+0x64): undefined reference to `lseek'
grabbytes.c:(.text+0x8f): undefined reference to `lseek'
grabbytes.c:(.text+0xaa): undefined reference to `read'
grabbytes.c:(.text+0xc5): undefined reference to `write'
grabbytes.c:(.text+0xe0): undefined reference to `read'
collect2: error: ld returned 1 exit status
在此之前,我必须根据内核头文件中的值手动定义 SEEK_END 和 SEEK_SET。否则它会错误地说那些没有定义,这是有道理的。
我想我需要链接到一个未剥离的 vmlinux 以提供要使用的符号。但是,我通读了这些符号,虽然有很多 llseek,但它们并不是 llseek 逐字记录的。
所以我的问题可以有几个方向:
如何指定一个 ELF 文件来使用其中的符号?而且我猜测是否/如何可能,符号将不匹配。如果这是正确的,是否有一个现有的头文件将重新定义 llseek 和 default_llseek 或内核中的任何内容?
有没有更好的方法在没有 libc 的情况下用 C 编写 Posix 代码?
我的目标是使用(可能仅)unistd.h 编写或移植相当标准的 C 代码,并在没有 libc 的情况下调用它。如果没有一些 unistd 函数,我可能没问题,并且不确定哪些函数“纯粹”作为内核调用存在。我喜欢组装,但这不是我的目标。希望尽可能严格地保持 C(如果必须的话,我可以使用一些外部程序集文件),以便在某些时候允许使用 libc-less 静态系统。
感谢您的阅读!