Запуск 32-битной программы на Debian 64-бит.

Вопрос или проблема

У меня есть образец приложения и 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, которая отсутствует в системе, что вызывает затруднения. Давайте подробно рассмотрим вашу ситуацию и предложим пути ее решения.

Анализ проблемы

  1. Степени совместимости: Вы используете инструменты компиляции для 32-битной архитектуры (x86_i586-gcc для компиляции и i686-linux-gnu-ld для компоновки), что правильно, однако, важно убедиться, что ваши компиляторы и компоновщики настроены должным образом для работы с 32-битными библиотеками.

  2. Необходимые библиотеки: Результаты команды ldd test_program показывают, что библиотека libc.so.1 пытается загрузиться в момент выполнения. Это происходит из-за того, что компоновщик создаёт ссылки на ненужные библиотеки. Библиотека libc.so.6, с которой у вас нет конфликтов, должна использоваться вместо libc.so.1.

  3. Использование системы: Возможно, ваша система по умолчанию не настроена на использование 32-битных библиотек. Убедитесь, что у вас установлены соответствующие пакеты. Обычно это делается с помощью:

    sudo dpkg --add-architecture i386
    sudo apt update
    sudo apt install libc6:i386 libc6-dev:i386

Решение

  1. Изменение Makefile: Убедитесь, что переменные CC и LD корректно указывают на 32-битные компиляторы и компоновщики без конфликтов зависимостей. Попробуйте внести изменения в ваш Makefile:
CC = gcc -m32
LD = ld -m32

Это принудит компилятор и компоновщик использовать 32-битные режимы.

  1. Использование правильного компоновщика: Убедитесь, что LD ссылается на правильный путь к 32-битной libc. Попробуйте явно указать путь к библиотекам в GNU Linker, используя опцию -L для указания 32-битной библиотеки:
$(TARGET): $(OBJS)
        $(LD) -L/lib/i386-linux-gnu/ -lc -o $(TARGET) $(OBJS)
  1. Проверка системных библиотек: Используйте dpkg для проверки наличия необходимых 32-битных библиотек и подключите их, если они отсутствуют:
dpkg --get-selections | grep libc6

Если вы видите, что 32-битная версия отсутствует, установите её через apt.

  1. Устранение зависимости от 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, вы сможете успешно скомпилировать и запустить вашу программу. Если проблемы продолжаются, изучите вывод ошибок и проверьте зависимости, что позволит детально определить их источник.

Оцените материал
Добавить комментарий

Капча загружается...