Консультация № 200298
19.02.2021, 21:58
0.00 руб.
0 8 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

при компиляции "g++ -c file.gcc" получаем объектный файл, далее набирая "objdump -S -M intel -d main.o > file.dump" получаем читабельный формат объектного файл, вопрос где можно почитать о структуре объектного файла? и чем отличается этот объектный файл от созданного объектного файла ассемблера фасм?

Обсуждение

давно
Посетитель
401281
56
19.02.2021, 21:59
общий
виндовс 7
компилятор mingw-w64
давно
Академик
20764
1861
19.02.2021, 23:15
общий
на кой чёрт вам это понадобилось?
давно
Посетитель
401281
56
20.02.2021, 00:13
общий
Адресаты:
в целях познания
давно
Старший Модератор
31795
6196
20.02.2021, 03:33
общий
Адресаты:
Цитата: Arthur
и чем отличается этот объектный файл от созданного объектного файла ассемблера фасм

Ничем, но чтобы его получить в FASM - нужно быть таким "извращенцем".

Сама IDE FASM не создает OBJ-файл, сразу исполняемый. OBJ-файл в FASM - можно получит с помощью командной строки c кучей опций. Оно Вам нужно?

Сам по себе OBJ-файл, представляет почти готовый код и описание переменных этого кода, который позволяет вставлять код одного ЯВУ в код другого ЯВУ, как библиотеку, при создании исполняемого файла. Но это было актуально в 90-х. В настоящее время этим никто не заморачивается.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401281
56
20.02.2021, 11:05
общий
Адресаты:
Оно Вам нужно? нет! просто стало интересно как оно устроено и есть ли различие между fasm g++, спасибо за разъяснение
давно
Академик
20764
1861
20.02.2021, 17:39
общий
Ещё раз — что вы хотите там узнать полезного? Насколько помню, у gcc есть ключ для того, чтобы сгенерировать код на ассемблере. Всё полезнее.
давно
Старший Модератор
31795
6196
22.02.2021, 20:08
общий
22.02.2021, 20:30
Адресаты:
Есть два формавта OBJ-файла:
  • Object Module Format;
  • Common Object File Format.

Их структура простая, как угол дома.
  • синатура;
  • (директива EXTERN); описание секции - import;
  • (директива PUBLIC)]описание секции - export;
  • (диреjктива COMMON) оиписание секций import + export;
  • .CODE -> TEXT секция кода, в которую можнго внести изменения настройки, взависимости от секции import+export;
  • .DATA -> DATA секция данных. Их компонуют по признаку DBGOUP, если есть другие группы, они компонинуют отдельно.


Любой - LINK, зная эти форматы, анализирует, исключает взаимоповторы, и компилирует нужный код, расатавляя нужные ссылки-связи.
Повторю вопрос: Оно Вам нужно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
24.02.2021, 21:16
общий
это ответ
Здравствуйте, Arthur!

Цитата: Arthur
можно почитать о структуре объектного файла

Нигде, вернне источников много, и все они по разному это нитерпретируют. Это эдинственное, в чем они сходятся:
Цитата: см. описание
линкер должен полностью разобрать объектный файл , чтобы извлечь всю информацию

Обратите на наличие следующих байтов в системе.

Их нужно анализировать отдельно.

Хакнуть самому, т.е. => Написать свой Dump'er:


Один код - разными компиляторами(слева-MASM, справа-TASM):
[code lang=asm].model small
.stack 256h
.code
;.386
start:
;
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
;
mov ah,9
lea dx,dbEnter
int 21h
mov ah,0ah
lea dx,dbStrM
int 21h
lea bx,dbStr
xor ch,ch
mov cl,dbStrL
@@01: add byte ptr[bx],2
inc bx
loop @@01
mov byte ptr[bx],'$'
mov al,' '
mov dbStrM,al
mov dbStrL,al
mov ah,9
lea dx,dbCode
int 21h
xor ax,ax
int 16h
mov ax,4C00h
int 21h
.data
dbEnter db 10,13,'Enter string :$'
dbCode db 10,13,'Code string:'
dbStrM db 128
dbStrL db ?
dbStr db 129 dup(?)
end start[/code]

т.е. ОДНОГО СТАНДАРТА НЕТ

Включить листинг компиляции, т.е. получит байт-код, который будем искать:


Второй -третий байт пропускаем (о этом говорит листинг MASM(там может быть "мусор" от предыдущей компиляции, TASM всегда ставит ноль). Секции обозначены в листинге, за ними должно быть само описание(либо прямой адрес с начала файла, либо, относительный от описания секции, либо от конца "раздела оиписаний" ), в любом случае занимайтесь математикой. Ищите ссылки на начало сегмента кода, сегмент данных и так видно. Вы найдете структуру описания сегмента. Второй - третий байт изменяются загрузчиком ОСи(взависимости от свободной памяти в данный момент), т..е. на эти байты должна указывать некоторая структура - таблица перемещения. Чтобы её найти, можно сегиент несколько раз перзаписывать, не важно. что один и тот-же. Но это позволит найти общие стуктуры, которые поменялись.

Запустить objdump с опцией HELPили /?, посмотреть на опции, перевести их, понять, запустить с опциями и посмотреть, что даст objdump, возможно нужно будет переводить с Х10 в Х16 , т.е.

Эдинственное более стандартизированное описание OBJ-файлов есть(судя по оглавлению) в книге: Джон Р. Левин - John R. Levine: Linkers and Loaders (The Morgan Kaufmann Series in Software Engineering and Programming) - но в свободном доступе её нет, первода на русский- нет, и на одном из сайтов указана цена в 350 у.е..

Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа