LINUX.ORG.RU

Расскажите, пожалуйста, про x32 ABI

 ,


0

1

смотрел статью
https://en.wikipedia.org/wiki/X32_ABI
но она не прояснила сути.

Вопросы у меня такие:
1) какие ключи надо передавать в as и в ld, чтобы получить бинарник для x32 ABI
2) чем будет отличаться заголовок ELF-файла (какими значениями в каких полях)
3) в чём будут отличия при написании ассемблерного кода по сравнению с x64

Либо crossdev, либо чрут. Все макросы с ифдефами 64 битные сломаются. Можешь использовать. Если у тебя есть приложение, можешь собирать билд для этого аби ради лулзов.

anonymous ()
Ответ на: комментарий от bdfy

По ссылке Линус говорит обратное. Ну и потом можно выжать бесплатной производительности из имеющегося железа, просто бизнесу проще купить ещё железа помощнее чем поддерживать аби.

anonymous ()
Ответ на: комментарий от bdfy

это по мнению какого-то Andy Lutomirski, но даже он отметил, что поддержка есть в Debian и в Gentoo. А Debian - это очень базовый дистрибутив, в том смысле, что там много разработчиков. Так что слухи о ненужности преувеличены.

Дискуссия проходит прямо сейчас, решение не принято, чем закончится - неизвестно, поэтому нельзя брать и говорить «оно загнулось».

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

Народ это не пользует, т.к. в куче софта имеются проблемы. Софт не патчат, т.к. народ это не пользует. Но ты можешь продолжать страдать, никто, думаю против не будет.

bdfy ★★★★ ()

2) чем будет отличаться заголовок ELF-файла (какими значениями в каких полях)

Держу вас в курсе:

e_ident[EI_CLASS]: ELFCLASS32            или ELFCLASS64
e_machine:         EM_386                или EM_X86_64
e_ehsize:          52(sizeof Elf32_Ehdr) или 64(sizeof Elf64_Ehdr)
e_phentsize:       32(sizeof Elf32_Phdr) или 56(sizeof Elf64_Phdr)
e_shentsize:       40(sizeof Elf32_Shdr) или 64(sizeof Elf64_Shdr)

Доказательство:

gcc -xc -m32 -o bin32 - <<< 'int main(void){return 0;}'
gcc -xc      -o bin64 - <<< 'int main(void){return 0;}'
#include <inttypes.h>
#include <stdio.h>
#include <elf.h>

int main(void)
{
	FILE       *file;
	Elf32_Ehdr  hdr32;
	Elf64_Ehdr  hdr64;

#define READ_HEADER(bits) do \
	{ \
		file = fopen("bin"#bits, "rb"); \
		fread(&hdr##bits, sizeof(hdr##bits), 1, file); \
		fclose(file); \
	} while (0)

	READ_HEADER(32);
	READ_HEADER(64);

#undef READ_HEADER

#define CHECK_FIELD(field) do \
	{ \
		if (hdr32.field != hdr64.field) \
			printf(#field": %"PRIu64" vs %"PRIu64"\n", (uint64_t)hdr32.field, (uint64_t)hdr64.field); \
	} while (0)

	CHECK_FIELD(e_ident[EI_MAG0]);
	CHECK_FIELD(e_ident[EI_MAG1]);
	CHECK_FIELD(e_ident[EI_MAG2]);
	CHECK_FIELD(e_ident[EI_MAG3]);

	CHECK_FIELD(e_ident[EI_CLASS]);
	CHECK_FIELD(e_ident[EI_DATA]);
	CHECK_FIELD(e_ident[EI_VERSION]);
	CHECK_FIELD(e_ident[EI_OSABI]);
	CHECK_FIELD(e_ident[EI_ABIVERSION]);

	CHECK_FIELD(e_type);
	CHECK_FIELD(e_machine);
	CHECK_FIELD(e_version);
	CHECK_FIELD(e_entry);
	CHECK_FIELD(e_phoff);
	CHECK_FIELD(e_shoff);
	CHECK_FIELD(e_flags);
	CHECK_FIELD(e_ehsize);
	CHECK_FIELD(e_phentsize);
	CHECK_FIELD(e_phnum);
	CHECK_FIELD(e_shentsize);
	CHECK_FIELD(e_shnum);
	CHECK_FIELD(e_shstrndx);

#undef CHECK_FIELD
	return 0;
}
goto-vlad ()

1) какие ключи надо передавать в as и в ld, чтобы получить бинарник для x32 ABI

В as - --x32, в ld - -m elf32_x86_64. Но лучше их задавать через драйвер gcc: gcc -mx32 ....

2) чем будет отличаться заголовок ELF-файла (какими значениями в каких полях)

Предлагаю сравнить вывод readelf:

$ echo 'int main(){}' | gcc -c -mx32 -x c - -o a.x32
$ echo 'int main(){}' | gcc -c -m64 -x c - -o a.64
$ diff -U10 <(readelf -h a.x32) <(readelf -h a.64)
--- /dev/fd/63  2019-02-13 08:53:02.036807405 +0000
+++ /dev/fd/62  2019-02-13 08:53:02.036807405 +0000
@@ -1,20 +1,20 @@
 Заголовок ELF:
-  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
-  Класс:                             ELF32
+  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
+  Класс:                             ELF64
   Данные:                            дополнение до 2, от младшего к старшему
   Версия:                            1 (current)
   OS/ABI:                            UNIX - System V
   Версия ABI:                        0
   Тип:                               REL (Перемещаемый файл)
   Машина:                            Advanced Micro Devices X86-64
   Версия:                            0x1
   Адрес точки входа:                 0x0
   Начало заголовков программы:       0 (байт в файле)
-  Начало заголовков раздела:         404 (байт в файле)
+  Начало заголовков раздела:         504 (байт в файле)
   Флаги:                             0x0
-  Размер этого заголовка:            52 (байт)
+  Размер этого заголовка:            64 (байт)
   Размер заголовков программы:       0 (байт)
   Число заголовков программы:        0
-  Размер заголовков раздела:         40 (байт)
+  Размер заголовков раздела:         64 (байт)
   Число заголовков раздела:          11
   Индекс табл. строк загол. раздела: 10

3) в чём будут отличия при написании ассемблерного кода по сравнению с x64

От amd64 различия минимальные. Только надо учитывать, что 64-разрядные регистры с указателями должны хранить 32-разрядные значения.

Проще всего сравнить вывод на примерах gcc -mx32 ....

sf ★★ ()
Ответ на: комментарий от Einstok_Fair

Держу в курсе что это быстрее работает у меня так 64битная сборка собрана и как нативно там завести те же 64 битные игрушки я знаю , просто это заблокировали для показа потому что это быстрее в 10 раз , на ютубе ищи 16.04 самая быстрая. Hls , egl , glx , gdi

anonymous ()
Ответ на: комментарий от sf

Простой вопрос:
почему нужно передавать ключ в ассемблер, если составлением заголовка ELF-файла занимается линкер, а кроме заголовка эти файлы ничем не различаются?

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

почему нужно передавать ключ в ассемблер, если составлением заголовка ELF-файла занимается линкер а кроме заголовка эти файлы ничем не различаются?

ELF-заголовки генерит и ассемблер и линкер:

$ echo '' | as --x32 - -o a.o; file a.o a.o: ELF 32-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

Линкеру на вход подаются ELF файлы.

sf ★★ ()