Родились сегодня:
Азимджон
colt38


Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

973

Россия, Северодвинск


ID: 165461

Лангваген Сергей Евгеньевич

Советник

684

Россия, Московская обл.


ID: 398750

Елена Васильевна

Специалист

399

Беларусь, Гомель


ID: 401284

Михаил Александров

Академик

317

Россия, Санкт-Петербург


ID: 137394

Megaloman

Мастер-Эксперт

203

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

185


ID: 401888

puporev

Профессор

162

Россия, Пермский край


8.3.1

01.03.2021

JS: 2.4.1
CSS: 4.4.0
jQuery: 3.5.1


 

• С / С++

Создание программ на языках C и C++.

Администратор раздела: CradleA (Академик)


Коцюрбенко Алексей Владимирович
Статус: Старший модератор
Рейтинг: 464
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 283
Gluck
Статус: 8-й класс
Рейтинг: 195
 

Перейти к консультации №:
 

Консультация онлайн # 200298
Раздел: • С / С++
Автор вопроса: Arthur (Посетитель)
Дата: 19.02.2021, 21:58
Поступило ответов: 1

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

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

Состояние: Консультация закрыта

Здравствуйте, Arthur!

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

Arthur

Нигде, вернне источников много, и все они по разному это нитерпретируют. Это эдинственное, в чем они сходятся:

линкер должен полностью разобрать объектный файл , чтобы извлечь всю информацию


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

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

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


Один код - разными компиляторами(слева-MASM, справа-TASM):
Код (Assembler) :: выделить код
.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


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

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


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

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

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

Удачи!


Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 24.02.2021, 21:16

5
нет комментария
-----
Дата оценки: 26.02.2021, 20:10

Рейтинг ответа:

+1

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 200298

Arthur

Посетитель

ID: 401281

1

= общий = |  19.02.2021, 21:59 |  цитировать |  профиль |  личное сообщение

виндовс 7
компилятор mingw-w64

Хватов Сергей

Академик

ID: 20764

2

= общий = |  19.02.2021, 23:15 |  цитировать |  профиль |  личное сообщение

на кой чёрт вам это понадобилось?

Arthur

Посетитель

ID: 401281

3

= общий = |  20.02.2021, 00:13 |  цитировать |  профиль |  личное сообщение
Хватов Сергей:

в целях познания

Зенченко Константин Николаевич

Старший модератор

ID: 31795

4

 +1 
 
= общий = |  20.02.2021, 03:33 |  цитировать |  профиль |  личное сообщение
Arthur:

и чем отличается этот объектный файл от созданного объектного файла ассемблера фасм

Arthur

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

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

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

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Arthur

Посетитель

ID: 401281

5

= общий = |  20.02.2021, 11:05 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Оно Вам нужно? нет! просто стало интересно как оно устроено и есть ли различие между fasm g++, спасибо за разъяснение

Хватов Сергей

Академик

ID: 20764

6

= общий = |  20.02.2021, 17:39 |  цитировать |  профиль |  личное сообщение

Ещё раз — что вы хотите там узнать полезного? Насколько помню, у gcc есть ключ для того, чтобы сгенерировать код на ассемблере. Всё полезнее.

Зенченко Константин Николаевич

Старший модератор

ID: 31795

7

 +1 
 
= общий = |  22.02.2021, 20:08 |  цитировать |  профиль |  личное сообщение
Arthur:

Есть два формавта OBJ-файла:

  • Object Module Format;
  • Common Object File Format.

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


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

Последнее редактирование 22.02.2021, 20:30 Зенченко Константин Николаевич (Старший модератор)

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.