создать 32-битный код в 64-битной системе linux (kubuntu 18.04) - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь перенести 32-битное приложение AIX на linux - проверяя концепцию моей 64-битной настольной системы Kubuntu. Полагаю, я мог бы построить приложение в 64-битном режиме, но, боюсь, что-то может сломаться (тысячи модулей - это целая система приложений).

В любом случае, я пытался создать тривиальное приложение. это просто printf sizeof int, короткие и длинные переменные. Когда я собираю его с помощью 'cc test / c', он работает, и sizeof сообщает 8-байт в течение долгого времени - так что по умолчанию используется 64-битный режим. Но когда я пытаюсь собрать его с помощью теста 'cc -m32. c', он не скомпилируется.

In file included from test.c:1:0:
/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory
 #include <bits/libc-header-start.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

Так что /usr/include/stdio.h содержит ссылку на биты /libc-header-start.h, и нет подкаталога / usr / include / bits. Но если это ошибка, почему компилятор не жалуется на это, когда я запускаю его без флага -m32? Я не вижу никаких условных логик c вокруг #include в stdio.h, так что за магию c мне не хватает? Есть ли другое дерево / usr / include, которое вызывается с флагом -m32?

Различные посты здесь посвящены проблеме построения 32-бит на 64-битной машине, но это старые посты и ссылка на более старую базу убунту. В любом случае, они предлагают убедиться, что соответствующие библиотеки загружены. Я получил их (и я предполагаю, что если они уже были там, моя 32-битная среда сборки должна быть в порядке). Что-то еще мне не хватает?

lib32gcc-4.8-dev/bionic 4.8.5-4ubuntu8 amd64
gcc-multilib/bionic-updates,bionic-security 4:7.4.0-1ubuntu2.3 amd64

Хорошо, я вижу, что в каталоге / usr / include / x86-64- linux -gnu есть каталог с битами, но нет параллельного для не-64-битная среда.

$ locate libc-header-start.h
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h

Итак, что мне установить, чтобы получить это? У меня уже установлены эти:

libc6-dev-i386/bionic 2.27-3ubuntu1 amd64
libc6-dev-i386-amd64-cross/bionic-updates,bionic-updates 2.27-3ubuntu1cross1.1 all
libc6-dev-i386-cross/bionic-updates,bionic-updates 2.27-3ubuntu1cross1.1 all
libc6-dev-i386-x32-cross/bionic-updates,bionic-updates 2.27-3ubuntu1cross1.2 all

1 Ответ

0 голосов
/ 01 мая 2020

Оказывается, мне пришлось установить g cc -multilib и g ++ - multilib, чтобы получить недостающий материал. Это работает сейчас.

Извините, если это старый, старый вопрос. Опять же, кому-то может понадобиться эта информация.

Упс. Этого было достаточно, чтобы получить простое приложение для сборки, но когда я пытаюсь создать свое реальное приложение, которое использует 'curses', -lcurses заканчивает тем, что пытается получить -ltinfo, и ld жалуется на это:

/usr/bin/ld: skipping incompatible //usr/lib/x86_64-linux-gnu/libtinfo.so when searching for -ltinfo

Я не называю 'ld' напрямую. Мой оператор ссылки - это вызов 'cc -g -m32 ...', т. Е. Я рассчитываю на CFLAGS для создания 32-битного двоичного файла, но компоновщик все еще пытается добавить 64-битный код. Я пытался вызвать 'ld' напрямую, но ему не нравится флаг -m32. Говорит, что это «несовместимый режим эмуляции».

Реально ли построить 32-битные двоичные файлы - или мне лучше настроить мою конфигурацию так, чтобы она воспринимала linux как 64-битную платформу и пыталась эта работа ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...