LINUX.ORG.RU

Кросс-компиляция из под aarch64 в x86_64 и статичные библиотеки

 ,


0

1

Убунта 22.04 aarch64
Компиляем простенький код на С под х86_64:

x86_64-linux-gnu-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Generator.d" -MT"src/Generator.o" -o "src/Generator.o" "src/Generator.c" -lm -pthread -static
x86_64-linux-gnu-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Uart.d" -MT"src/Uart.o" -o "src/Uart.o" "src/Uart.c"
x86_64-linux-gnu-gcc -o "Generator" ./src/Uart.o ./src/Generator.o     -lm -pthread -static

пути линкер цепляет вроде бы корректные, только в них действительно нет искомого:

/usr/lib/gcc-cross/x86_64-linux-gnu/11/../../../../x86_64-linux-gnu/bin/ld: cannot find /usr/lib/x86_64-linux-gnu/libm-2.35.a: No such file or directory
/usr/lib/gcc-cross/x86_64-linux-gnu/11/../../../../x86_64-linux-gnu/bin/ld: cannot find /usr/lib/x86_64-linux-gnu/libmvec.a: No such file or directory
collect2: error: ld returned 1 exit status

если отключить статичную привязку либ то всё компилится как положено:

file Generator 
Generator: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=1b3a24f45fc891bd581d11c35dde178154b8a1e0, for GNU/Linux 3.2.0, with debug_info, not stripped

gcc подкидывал через apt install gcc-x86-64-linux-gnu что в свою очередь привезло вроде как всё что нужно:

binutils-x86-64-linux-gnu cpp-11-x86-64-linux-gnu cpp-x86-64-linux-gnu gcc-11-cross-base
  gcc-11-x86-64-linux-gnu gcc-11-x86-64-linux-gnu-base gcc-12-cross-base libasan6-amd64-cross
  libatomic1-amd64-cross libc6-amd64-cross libc6-dev-amd64-cross libgcc-11-dev-amd64-cross
  libgcc-s1-amd64-cross libgomp1-amd64-cross libitm1-amd64-cross liblsan0-amd64-cross
  libquadmath0-amd64-cross libstdc++6-amd64-cross libtsan0-amd64-cross libubsan1-amd64-cross
  linux-libc-dev-amd64-cross

потом еще подкинул из suggested gcc-11-multilib-x86-64-linux-gnu

вопрос - как полечить?

★★★★
Ответ на: комментарий от undef

беда в том что либс стоит:

libc6-dev/jammy-updates,now 2.35-0ubuntu3.1 arm64 [installed]
  GNU C Library: Development Libraries and Header Files

libc6-dev-amd64-cross/jammy,now 2.35-0ubuntu1cross3 all [installed,automatic]
  GNU C Library: Development Libraries and Header Files (for cross-compiling)

libc6-dev-i386-amd64-cross/jammy,now 2.35-0ubuntu1cross3 all [installed,automatic]
  GNU C Library: 32-bit development libraries for AMD64 (for cross-compiling)

libc6-dev-x32-amd64-cross/jammy,now 2.35-0ubuntu1cross3 all [installed,automatic]
  GNU C Library: X32 ABI Development Libraries for AMD64 (for cross-compiling)

без этого по идее не собралось бы без статики
для статики линкер видимо пытается выдернуть заранее подсобранные модули, которых нема :-(

rukez ★★★★
() автор топика

С glibc не собирается статически насколько я помню. Смотри ниже для подробностей https://stackoverflow.com/questions/57476533/why-is-statically-linking-glibc-...

Для статической линковки используйте иную libc, например musl.

vbcnthfkmnth123 ★★★★★
()
Последнее исправление: vbcnthfkmnth123 (всего исправлений: 4)
Ответ на: комментарий от vbcnthfkmnth123

С glibc не собирается статически

тама очень простенький код, на х86_64 машине он без проблем собирается статично с глибс (на рхеле правда для этого надо подцепить пакет glibc-static) под собсно х86_64 и без особых проблем собирается на ней-же статично под арм (32 битный) с помощью arm-linux-gnueabi-gcc

на аарч64 статично под аарч64 то-же проблем нет, а вот собрать на аарч64 под х86_64 (под арм32 пока не пробовал) - не получается :-(

по логике мне наверное надо собрать глибс под 86_64 и положить в целевую папку куда лезет линкер но я почему-то уверен что все может быть несколько проще :-)

rukez ★★★★
() автор топика
Ответ на: комментарий от vbcnthfkmnth123

Не может. Это glibc.

только что проверил, на аарч64 ставим gcc-arm-linux-gnueabi:

The following additional packages will be installed:
  binutils-arm-linux-gnueabi cpp-11-arm-linux-gnueabi cpp-arm-linux-gnueabi gcc-11-arm-linux-gnueabi
  gcc-11-arm-linux-gnueabi-base libasan6-armel-cross libatomic1-armel-cross libc6-armel-cross
  libc6-dev-armel-cross libgcc-11-dev-armel-cross libgcc-s1-armel-cross libgomp1-armel-cross
  libstdc++6-armel-cross libubsan1-armel-cross linux-libc-dev-armel-cross

заменяем x86_64-linux-gnu-gcc на arm-linux-gnueabi-gcc и всё нормально собирается со статикой:

ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, BuildID[sha1]=d99d0b19764c96209d9872386645b5fe5f51c3be, for GNU/Linux 3.2.0, with debug_info, not stripped

но ведь набор пакетов для армел и 86_64 одинаковый по составу либ о_О

rukez ★★★★
() автор топика
Последнее исправление: rukez (всего исправлений: 1)
Ответ на: комментарий от rukez

libc6-dev:amd64 конечно же.

Как-то так:

dpkg --add-architecture amd64
apt update
apt install libc6-dev:amd64

Если libc собрана с поддержкой multi-arch, то должно помочь. Если apt install будет предупреждать о сломанных пакетах, стоит прислушаться.

undef ★★
()
Последнее исправление: undef (всего исправлений: 1)
Ответ на: комментарий от undef

Как-то так:

Беда в том что для портс нема архитектуры амд64 (если глянуть листинг http://ports.ubuntu.com/ubuntu-ports/dists/jammy/main/ то там действительно нет ни 386 ни амд64):

E: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/dists/jammy/main/binary-amd64/Packages  404  Not Found [IP: 185.125.190.36 80]
E: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/dists/jammy-updates/main/binary-amd64/Packages  404  Not Found [IP: 185.125.190.36 80]
E: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/dists/jammy-backports/main/binary-amd64/Packages  404  Not Found [IP: 185.125.190.36 80]
E: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/dists/jammy-security/main/binary-amd64/Packages  404  Not Found [IP: 185.125.190.36 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy/main/binary-arm64/Packages  404  Not Found [IP: 91.189.91.38 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.

если подпихнуть обычное в сорцы:

deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse

то он при обновлении дерево пакетов вычитывает но в списке пакетов игнорирует

а вот если ручками поставить пакеты libc6_2.35-0ubuntu3.1_amd64.deb и libc6-dev_2.35-0ubuntu3.1_amd64.deb скачанные с репки то папка обрастает нужным:

ls /usr/lib/x86_64-linux-gnu/
Mcrt1.o               libc.so                 libnss_compat.so.2
Scrt1.o               libc.so.6               libnss_dns.so.2
audit                 libc_malloc_debug.so    libnss_files.so.2
bfd-plugins           libc_malloc_debug.so.0  libnss_hesiod.so
crt1.o                libc_nonshared.a        libnss_hesiod.so.2
crti.o                libdl.a                 libpcprofile.so
crtn.o                libdl.so.2              libpthread.a
gconv                 libg.a                  libpthread.so.0
gcrt1.o               libm-2.35.a             libresolv.a
grcrt1.o              libm.a                  libresolv.so
ld-linux-x86-64.so.2  libm.so                 libresolv.so.2
ldscripts             libm.so.6               librt.a
libBrokenLocale.a     libmcheck.a             librt.so.1
libBrokenLocale.so    libmemusage.so          libthread_db.so
libBrokenLocale.so.1  libmvec.a               libthread_db.so.1
libanl.a              libmvec.so              libutil.a
libanl.so             libmvec.so.1            libutil.so.1
libanl.so.1           libnsl.so.1             rcrt1.o
libc.a                libnss_compat.so

И файлик даже собирается:

ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=63baa4af50431768d301204819f74b6ad2ec57ae, for GNU/Linux 3.2.0, with debug_info, not stripped

проверил - отлично работает :-)

Спасибо большое!

rukez ★★★★
() автор топика
Последнее исправление: rukez (всего исправлений: 1)
Ответ на: комментарий от rukez

Я на дебияне эти манипуляции выполнял. Если с поправкой на убунту

echo 'deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse' > /etc/apt/sources.list.d/amd64.list

В /etc/apt/source.list может понадобиться тоже явно указать [arch=arm64]. Далее добавляем архитектуру dpkg --add-architecture amd64, обновляем список пакетов и ставим amd64 пакеты, явно указывая архитектуру apt install libc6-dev:amd64.

undef ★★
()