Этот простой тестовый пример:
#include <unistd.h>
void _start(void) {
_exit(0);
}
вылетает при запуске на Debian 12.6 i386.
Составлено с помощью gcc -lc -nostdlib -static -Os
. Обратите внимание, что это версия Debian i386.
В БДБ:
0x804905b <_exit+59> call *%gs:0x10
$gs
равен 0.
Он все равно вылетает, если я удаляю вызов _exit
.
Не работает ли Debian i386 при запуске статических исполняемых файлов без основного? У меня нет проблем с системами amd64 (FreeBSD 14.0 с clang и Fedora 39). Также нет проблем во FreeBSD при компиляции для i386.
ОБНОВЛЯТЬ: В Fedora 39 amd64 glibc 2.39 GCC 14.2.1 та же проблема.
Это новая установка сегодня утром, все установлено с помощью apt. Вы хотите сказать, что apt устанавливает пакеты по умолчанию (в данном случае glibc-static), несовместимые с ядром?
Может быть. i386 устарел, поэтому я не удивлён, что каких-то изменений там не видно. В любом случае: укажите номера версий (также для других случаев (дистрибутивов), которые вы тестировали.
На странице руководства по выходу указано следующее:
До glibc 2.3 функция-обертка _exit() вызывала ядро. одноименный системный вызов. Начиная с glibc 2.3, функция-обертка вызывает exit_group(2), чтобы завершить все потоки в процесс.
функция _exit должна вызывать библиотечную функцию с версией glibc 2.3. Я думаю, что в Debian 12.6 используется glibc 2.3, а в других упомянутых вами системах используется предыдущая версия. Однако я не уверен, как вам удалось скомпилировать его статически, если это так.
Это похоже на дефект i386 Linux. В конце концов я просто внес изменения, чтобы тестовый пример работал только на Linux или amd64.
Примечание. Debian менее актуален (но помогает): вам следует написать версию компилятора, версию ядра и версию библиотеки, на которую вы ссылаетесь. -- Возможно, погуглив, вы сможете найти обсуждение портера и получить некоторые подсказки, иначе это может быть очень узкая проблема. Или спросите в списке рассылки Debian, где люди, занимающиеся портированием архитектуры, могут быстро обнаружить проблему. -- И уберите
_exit(0)
, если это не имеет значения. Мне кажется несовместимость libc и ядра.