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 関数がいくつかなくても問題ありませんが、どの関数がカーネル呼び出しとして「純粋に」存在するかどうかはわかりません。私は組み立てが大好きですが、ここでの私の目標ではありません。ある時点で libc を使用しない静的システムを可能にするために、可能な限り厳密に C にとどまることを望んでいます (必要に応じて、いくつかの外部アセンブリ ファイルで問題ありません)。
読んでくれてありがとう!