Вопрос или проблема
У меня есть образец приложения и make файл
Содержимое файла main.c
#include <stdio.h>
/*int mainentry_entry(int argc, char *argv[]) {*/
int main(int argc, char *argv[]) {
int i;
printf("argc = %d\n", argc);
for (i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
Содержимое makefile
Cl = i686-linux-gnu-ld
CC = x86_i586-gcc
CFLAGS = -Wall -Wextra -g
CFLAGS += -I/usr/i686-linux-gnu/include
TARGET = test_program
OBJS = main.o
all: $(TARGET)
$(TARGET): $(OBJS)
$(Cl) -L/lib/i386-linux-gnu/ -lc -o $(TARGET) $(OBJS)
main.o: main.c
$(CC) $(CFLAGS) -c main.c
clean:
rm -f $(TARGET) $(OBJS)
Я пытаюсь скомпилировать с помощью инструментария pikeos (x86_i586-gcc) и слинковать с 32-битным инструментом debian (i686-linux-gnu-ld), но на выходе я получаю test_program, который имеет ссылку на /usr/lib/libc.so.1, которого нет в папке /usr/lib/, может кто-то объяснить мне, почему не используется libc.so.6, который находится в /lib/i386-linux-gnu/libc.so.6
ldd test_program
linux-gate.so.1 (0xea48c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xea200000)
/usr/lib/libc.so.1 => /lib/ld-linux.so.2 (0xea48e000)
Ответ или решение
Запуск 32-битных программ на Debian 64-бит: Проблема с библиотеками
При попытке скомпилировать и запустить 32-битное приложение на 64-битной версии Debian может возникнуть ряд проблем, связанных с несовместимостью библиотек. В вашем случае, скомпилированная программа ссылается на libc.so.1
, которая отсутствует в системе, что вызывает затруднения. Давайте подробно рассмотрим вашу ситуацию и предложим пути ее решения.
Анализ проблемы
-
Степени совместимости: Вы используете инструменты компиляции для 32-битной архитектуры (
x86_i586-gcc
для компиляции иi686-linux-gnu-ld
для компоновки), что правильно, однако, важно убедиться, что ваши компиляторы и компоновщики настроены должным образом для работы с 32-битными библиотеками. -
Необходимые библиотеки: Результаты команды
ldd test_program
показывают, что библиотекаlibc.so.1
пытается загрузиться в момент выполнения. Это происходит из-за того, что компоновщик создаёт ссылки на ненужные библиотеки. Библиотекаlibc.so.6
, с которой у вас нет конфликтов, должна использоваться вместоlibc.so.1
. -
Использование системы: Возможно, ваша система по умолчанию не настроена на использование 32-битных библиотек. Убедитесь, что у вас установлены соответствующие пакеты. Обычно это делается с помощью:
sudo dpkg --add-architecture i386 sudo apt update sudo apt install libc6:i386 libc6-dev:i386
Решение
- Изменение Makefile: Убедитесь, что переменные
CC
иLD
корректно указывают на 32-битные компиляторы и компоновщики без конфликтов зависимостей. Попробуйте внести изменения в ваш Makefile:
CC = gcc -m32
LD = ld -m32
Это принудит компилятор и компоновщик использовать 32-битные режимы.
- Использование правильного компоновщика: Убедитесь, что
LD
ссылается на правильный путь к 32-битной libc. Попробуйте явно указать путь к библиотекам в GNU Linker, используя опцию-L
для указания 32-битной библиотеки:
$(TARGET): $(OBJS)
$(LD) -L/lib/i386-linux-gnu/ -lc -o $(TARGET) $(OBJS)
- Проверка системных библиотек: Используйте
dpkg
для проверки наличия необходимых 32-битных библиотек и подключите их, если они отсутствуют:
dpkg --get-selections | grep libc6
Если вы видите, что 32-битная версия отсутствует, установите её через apt
.
- Устранение зависимости от
libc.so.1
: Если после всех правок проблема всё ещё сохраняется, рассмотрите возможность создания символической ссылки наlibc.so.6
с именемlibc.so.1
(это крайняя мера и следует использовать с осторожностью):
sudo ln -s /lib/i386-linux-gnu/libc.so.6 /usr/lib/libc.so.1
Заключение
Запуск 32-битных программ на 64-битной системе Debian требует правильной настройки компиляторов и библиотек. Имея в своем распоряжении необходимые пакеты и правильно настроив Makefile, вы сможете успешно скомпилировать и запустить вашу программу. Если проблемы продолжаются, изучите вывод ошибок и проверьте зависимости, что позволит детально определить их источник.