Я заинтересован в создании статической программы ELF без (g) libc, используя unistd.h, предоставленный заголовками Linux.
Я прочитал эти статьи/вопросы, которые дают приблизительное представление о том, что я пытаюсь сделать, но не совсем: 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 или что-то еще в ядре?
Есть ли лучший способ написать код Posix на C без libc?
Моя цель состоит в том, чтобы написать или портировать довольно стандартный код C, используя (возможно, исключительно) unistd.h и вызывать его без libc. Я, вероятно, в порядке без нескольких функций unistd, и я не уверен, какие из них существуют «чисто» как вызовы ядра или нет. Я люблю сборку, но это не моя цель. Надеясь оставаться как можно более строгим C (я согласен с несколькими внешними файлами сборки, если мне нужно), чтобы в какой-то момент использовать статическую систему без libc.
Спасибо за чтение!
open()
иread()
самостоятельно, вызвав соответствующие действия, как указано в ABI ядра, что обычно включает в себя настройку регистров и последующее выполнение какой-либо инструкции прерывания процессора. Проблема в том, что детали этого ЧРЕЗВЫЧАЙНО зависят от архитектуры (ARM против x86 и т. д.) и усложняются такими вещами, как vsyscalls. - person Celada   schedule 19.01.2013