Сколько файлов требуется для загрузки программы в Linux? - PullRequest
3 голосов
/ 07 мая 2010

(Гипотетическая на данный момент) ситуация, когда пользователь моей системы получит кусок кода на C и нуждается в моей системе для компиляции и запуска его в изолированной программной среде chroot , которая генерируется летать, и я хочу требовать как можно меньше файлов в коробке. Я только хочу поиграть с настройками компилятора и компоновщика (например, со статической ссылкой все, что я могу ожидать найти) и наложить умеренное ограничение на то, что может ожидать код (например, они не могут использовать произвольные библиотеки).

Вопрос в том, насколько просто я могу получить песочницу. Очевидно, что мне нужен исполняемый файл, но как насчет загрузчика ELF и .so для системных вызовов? Могу ли я сбросить любой из них, и есть ли что-то еще, что мне нужно?

Ответы [ 2 ]

3 голосов
/ 07 мая 2010

Вам не нужно ничего, кроме исполняемого файла, для запуска статически связанного мира приветствия. Вам, конечно, понадобится лот больше, чтобы скомпилировать его.

Вы можете проверить это довольно легко, я сделал это с помощью следующего тривиального кода C:

#include <stdio.h>
int main() {
    puts("Hello, world\n");
    return 0;
}

скомпилируйте его с помощью gcc -static. Затем создайте новый каталог (я назвал его «chroot-dir»), переместите вывод («привет») в него. Таким образом, единственный файл в chroot - это исполняемый файл. Затем запустите chroot chroot-dir ./hello, и вы получите Hello, world .

Обратите внимание, что есть некоторые вещи, которые не могут быть скомпилированы статически. Например, если ваша программа выполняет аутентификацию (через PAM), модули PAM всегда загружаются динамически. Также обратите внимание, что различные файлы в / etc необходимы для определенных вызовов; любая из функций getpw * и getgr *, функций разрешения имен доменов и т. д. потребует nsswitch.conf (и некоторые общие объекты, и, возможно, больше файлов конфигурации, а иногда и больше исполняемых файлов, в зависимости от настроенных методов поиска.) /etc/hosts, /etc/services и /etc/protocols, вероятно, будут весьма полезны для любой сети.

Один простой способ выяснить, какие файлы использует программа, - запустить ее под strace. Конечно, сначала вы должны доверять программе.

0 голосов
/ 07 мая 2010

нет необходимости в загрузчике ELF. чтобы проверить, какие динамические библиотеки вам нужно сделать ldd <executable>. Если вам удастся статически скомпилировать все, ему не понадобится .so. Кроме того, речь идет только о структуре данных и каталогов, которая может понадобиться вашей программе.

Но все это только в том случае, если вы используете команду /usr/bin/chroot; если вы сами вызовете программу int chroot(const char *path); после того, как убедитесь, что все динамические библиотеки загружены, они вам ничего не понадобятся в изолированной программной среде каталога. даже не сам исполняемый файл.

edit: Другая идея: используйте TCC (или, скорее, libtcc , чтобы скомпилировать, связать, загрузить и запустить данный блок C. обработайте внутри «внешней» тюрьмы chroot, опустившись до «внутренней» (пустой) непосредственно перед выполнением (конечно, выполните в fork (), иначе вы не сможете вырваться из «внутренней» тюрьмы к «внешнему»). Вы также можете воспользоваться проверенным выполнением связанного libtcc.

...