Приветствую. Интересно стало узнать как устроен ELF (Executable and Linkable Format) заголовок. В процессе поиска в интернете смог много о чем узнать сам. Смог разобрать как составляется выбор архитектуры, ос, частично секции и прочее. Осталось часть вещей которые я не смог найти, а именно экспорт и импорт функций. По стандарту в FASM уже есть пример написания импорта и экспорта. Но он сделан более в упрощенном для пользователей виде через множество макросов, как и сам ELF заголовок. По сути мне достаточно разобрать все макросы по полочкам, но это займет время, так как я все-же в надежде найти хоть какой-то простейший пример. Иначе пойду разбирать макросы, как никак выход есть. Вот простой пример экспорта: Код (ASM): format ELF public MyFunctionName section '.text' MyFunctionName: retn В файле он автоматически задает название функции и ее адрес. Мне нужно разобрать это более детально. Для меня достаточно либо небольшого примера, либо хорошего источника информации (Который я упустил в поисках). Вот небольшой пример того чего я начал разбирать. Сейчас я завис на секциях, не могу правильно понять как их правильно воссоздать, так как в данном примере ошибка с секцией ".text", по какому принципу задается название, я не нашел поэтому склеил из примеров в интернете. возможно у вас завалялись свои, если не жалко буду рад: Спойлер: Код Код (ASM): format binary as 'so' ;file_header: ;e_ident: ;EI_CLASS: ELFCLASSNONE equ 0 ;32-х битная машина: ELFCLASS32 equ 1 ;64-х битная машина: ELFCLASS64 equ 2 ;EI_DATA: ELFDATANONE equ 0 ;байты следуют в порядке Little-endian: ELFDATA2LSB equ 1 ;байты располагаются в порядке Big-endian: ELFDATA2MSB equ 2 ;EI_VERSION: ;некорректное значение: EV_NONE equ 0 ;корректное значение: EV_CURRENT equ 1 ;EI_OSABI: ;UNIX System V ABI: ELFOSABI_SYSV equ 0 ;HP-UX operating system ABI: ELFOSABI_HPUX equ 1 ;Nx operating system ABI: ELFOSABI_NETBSD equ 2 ;3GNU/Linux operating system ABI: ELFOSABI_LINUX equ 3 ;GNU/Hurd operating system ABI: ELFOSABI_HURD equ 4 ;86Open Common IA32 ABI: ELFOSABI_86OPEN equ 5 ;Solaris operating system ABI: ELFOSABI_SOLARIS equ 6 ;Monterey project ABI: ELFOSABI_MONTEREY equ 7 ;IRIX operating system ABI: ELFOSABI_IRIX equ 8 ;Fx operating system ABI: ELFOSABI_FREEBSD equ 9 ;TRU64 UNIX operating system ABI: ELFOSABI_TRU64 equ 10 ;Novell Modesto: ELFOSABI_MODESTO equ 11 ;OpenBSD: ELFOSABI_OPENBSD equ 12 ;Open VMS: ELFOSABI_OPENVMS equ 13 ;HP Non-Stop Kernel: ELFOSABI_NSK equ 14 ;ARM architecture ABI: ELFOSABI_ARM equ 97 ;Standalone (embedded) ABI: ELFOSABI_STANDALONE equ 255 ;program_header: ;p_type: ;Обозначает не используемую запись: PT_NULL equ 0 ;Сегмент программы, загружаемый в память: PT_LOAD equ 1 ;Информация для динамического связывания: PT_DYNAMIC equ 2 ;Загрузчик программ: PT_INTERP equ 3 ;Дополнительная информация: PT_NOTE equ 4 ;Информация о самой таблице заголовков программы: PT_PHDR equ 6 ;Thread-local storage: PT_TLS equ 7 ;p_flags: ;Сегмент доступен на выполнение: PT_X equ 1 ;Сегмент доступен на запись: PT_W equ 2 ;Сегмент доступен на чтение: PT_R equ 4 ;program_section: ;sh_type: ;Пустой заголовок секции. Значения всех прочих полей заголовка секции неопределены: SHT_NULL equ 0 ;Секции программы (код или данные или что-либо еще): SHT_PROGBITS equ 1 ;Таблица символов (для объектных файлов или динамических библиотек): SHT_SYMTAB equ 2 ;Таблица строк: SHT_STRTAB equ 3 ;Записи о перемещаемых адресах (relocations): SHT_RELA equ 4 ;Хеш-таблица имен для динамического связывания: SHT_HASH equ 5 ;Информация для динамического связывания: SHT_DYNAMIC equ 6 ;Произвольная дополнительная информация: SHT_NOTE equ 7 ;Секция не занимает место в файле, но занимает место в адресном пространстве процесса: SHT_NOBITS equ 8 ;Записи о перемещаемых адресах: SHT_REL equ 9 ;sh_flags: ;Содержимое секции должно быть доступно на запись в адресном пространстве процесса: SHF_WRITE equ 1 ;Для содержимого секции выделяется память в адресном пространстве процесса: SHF_ALLOC equ 2 ;Секция содержит инструкции процессора: SHF_EXECINSTR equ 4 SHENTSIZE equ 40 PHENTSIZE equ 32 program_base = 0x00000000 use32 ;Заголовок файла: file_header: ;Массив 16 байт, каждый из которых определяет общую характеристику файла: e_ident: .size = 0x10 EI_MAG0 db 0x7F EI_MAG1 db 'E' EI_MAG2 db 'L' EI_MAG3 db 'F' ;определяет класс "машины": EI_CLASS db ELFCLASS32 ;определяет порядок следования байтов в файле: EI_DATA db ELFDATA2LSB ;определяет номер версии заголовка: EI_VERSION db EV_CURRENT ;определяет операционную систему и ABI: EI_OSABI db ELFOSABI_SYSV ;EI_ABIVERSION (определяет версию ABI): ;EI_PAD (начало зарезервированных байтов): ;EI_NIDENT(конец зарезервированных байтов): rb e_ident+e_ident.size-$ ;Тип файла: e_type dw 3 ;Архитектура аппаратной платформы, для которой файл создан: e_machine dw 3 ;Номер версии формата: e_version dd 1 ;Точка входа: e_entry dd start ;Расположение таблицы заголовков программы: e_phoff dd program_header ;Расположение таблицы заголовков разделов: e_shoff dd program_section ;Связанные с файлом флаги, зависящие от процессора: e_flags dd 0 ;Размер заголовка файла: e_ehsize dw 52;program_header-file_header ;Размер каждого заголовка программы: e_phentsize dw PHENTSIZE ;Число заголовков программы: e_phnum dw 1 ;Размер каждого заголовка разделов: e_shentsize dw SHENTSIZE ;Число заголовков разделов: e_shnum dw SHNUM ;Индекс записи в таблице разделов, указывающей на таблицу названий разделов: e_shstrndx dw SHSTRNDX ;Таблица заголовков секций: program_section: dd anullstr-start,SHT_NULL,0,0,0,0,0,0,0,0 SHSTRNDX = ($ - program_section) / SHENTSIZE ;Индекс имени секции: sh_name dd atext-start ;Тип секции: sh_type dd SHT_PROGBITS ;Флаги описывающие дополнительные атрибуты: sh_flags dd SHF_ALLOC+SHF_EXECINSTR ;адрес в виртуальном адресном пространстве процесса: sh_addr dd start ;смещение от начала файла: sh_offset dd start ;размер секции в байтах: sh_size dd start.size ;индекс другой секции: sh_link dd 0 ;информация о секции: sh_info dd 0 ;требование по выравниванию адреса начала секции в памяти: sh_addralign dd 0 ;размер одной записи: sh_entsize dd 0 SHNUM = ($ - program_section) / SHENTSIZE ;Таблица заголовков программы: program_header: ;Тип заголовка: p_type dd PT_LOAD ;Смещение от начала файла, по которому располагается данный сегмент: p_offset dd 0 ;Виртуальный адрес начала сегмента в памяти: p_vaddr dd program_base ;NULL: p_paddr dd 0 ;Размер сегмента в файле: p_filesz dd program_end-program_base ;Размер сегмента в памяти: p_memsz dd program_end-program_base ;флаги доступа к сегменту в памяти: p_flags dd PT_X+PT_W+PT_R ;: p_align dd 0x1000 start: retn anullstr db 0 atext db ".text", 0 start.size = $-start program_end: