LINUX: действительно ли возможно записать рабочую программу, которая не полагается на libc библиотеку?

Да, они называются «установщиками приложений» в install4j. На шаге «Установщик-> Экраны и действия» нажмите кнопку «Добавить», затем выберите «Добавить приложение» и выберите «Очистить пользовательское приложение» из шаблонов приложений.

Вы можете вызывать такие приложения через API, позвонив по

com.install4j.api.launcher.ApplicationLauncher.launchApplication(
  "", null, false, null
);

См. https://www.ej-technologies.com/resources/install4j/help/api/com/install4j/. api / launcher / ApplicationLauncher.html для Javadoc.

7
задан Bill the Lizard 8 February 2009 в 03:18
поделиться

6 ответов

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

Хорошо запустите с компиляции программы ELF, изучите спецификацию ELF и ремесло вместе заголовок, сегменты программы и другие части, в которых Вы нуждаетесь для программы. Ядро загрузило бы Ваш код и переход к некоторому начальному адресу. Вы могли поместить бесконечный цикл туда. Но не зная некоторый ассемблер, это безнадежно от запуска на так или иначе.

start.S файл, как используется glibc может быть полезным как стартовая точка. Попытайтесь изменить его так, чтобы можно было собрать автономный исполняемый файл из него. Тот запуск. S файл точка входа всех приложений ELF и тот, который звонит __libc_start_main который в свою очередь звонит main. Вы просто изменяете его так, это соответствует Вашим потребностям.

Хорошо, это было теоретически. Но теперь, что практическое применение, которое имеет?

Ответьте на обновленный вопрос

Хорошо. Существует названная библиотека libgloss это обеспечивает минимальный интерфейс для программ, которые предназначены для работы встроенных систем. newlib Использование библиотеки C, что один как ее интерфейс системного вызова. Общее представление состоит в том, что libgloss является слоем между библиотекой C и операционной системой. По сути, это также содержит файлы запуска, в которые вскакивает операционная система. Обе этих библиотеки являются частью GNU binutils проект. Я использовал их, чтобы сделать интерфейс для другой ОС и другого процессора, но, кажется, нет libgloss порта для Linux, поэтому при вызове системных вызовов необходимо будет сделать это самостоятельно как другие, уже указанные.

Абсолютно возможно записать программы в языке программирования C. Ядро Linux является хорошим примером такой программы. Но также и пользовательские программы возможны. Но то, что минимально требуется, является библиотекой времени выполнения (если Вы хотите сделать какой-либо серьезный материал). Такой содержал бы действительно основные функции, как memcpy, основные макросы и так далее. Стандарт C имеет специальный режим соответствия, названный автономным, который требует только очень ограниченного набора функциональности, подходящей также для ядер. На самом деле у меня нет подсказки о x86 ассемблере, но я попытал своего счастья для очень простой программы C:

/* gcc -nostdlib start.c */
int main(int, char**, char**);

void _start(int args)
{
    /* we do not care about arguments for main. start.S in 
     * glibc documents how the kernel passes them though.
     */
    int c = main(0,0,0);

    /* do the system-call for exit. */
    asm("movl   %0,%%ebx\n" /* first argument */
        "movl   $1,%%eax\n" /* syscall 1 */
        "int    $0x80"      /* fire interrupt */
        : : "r"(c) :"%eax", "%ebx");
}

int main(int argc, char** argv, char** env) {
    /* yeah here we can do some stuff */
    return 42;
}

Мы счастливы, это на самом деле компилирует и работает :)

7
ответ дан 6 December 2019 в 14:10
поделиться

Да, это возможно, однако необходимо будет сделать системные вызовы и настроить точку входа вручную.

Пример минимальной программы с точкой входа:

.globl _start
.text
_start:
    xorl %eax,%eax
    incl %eax
    movb $42, %bl
    int $0x80

Или в плоскости C (никакой выход):

void __attribute__((noreturn)) _start() {
    while(1);
}

Скомпилированный с:

gcc -nostdlib -o example example.s
gcc -nostdlib -o example example.c
5
ответ дан 6 December 2019 в 14:10
поделиться

В чистом C? Поскольку другие сказали, что Вам все еще нужен способ сделать syscalls, таким образом, Вы, возможно, должны были бы к выпадающему встроить asm для этого. Тем не менее, если использование gcc проверяет-ffreestanding.

2
ответ дан 6 December 2019 в 14:10
поделиться

Вам был бы нужен способ препятствовать тому, чтобы компилятор C генерировал код, который зависит от libc, который с gcc может быть покончили -fno-hosted. И Вам была бы нужна одна стандартная программа ассемблера для реализации syscall(2). Их не трудно записать, можно ли получить подходящую ОС doco. После этого Вы были бы прочь к гонкам.

2
ответ дан 6 December 2019 в 14:10
поделиться

Да Вы можете, но это довольно хитро.

Нет по существу абсолютно никакой точки.

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

Можно полностью обойтись без библиотеки C, в этом случае необходимо сделать системные вызовы с помощью соответствующего интерфейса низкого уровня, который является архитектурно-зависимым, и не обязательно международный 0x80.

Если Ваша цель делает очень небольшой автономный двоичный файл, Вы могли бы быть более обеспеченным статическим подключением против чего-то как uclibc.

0
ответ дан 6 December 2019 в 14:10
поделиться

Ну, необходимо было бы использовать некоторые системные вызовы для загрузки всего, что это - информация в память, таким образом, я сомневаюсь относительно этого.

И необходимо было бы почти использовать выход (), только из-за способа, которым работает Linux.

-1
ответ дан 6 December 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: