Внешние символы и COFF формат
От: Fylhe Россия  
Дата: 12.06.05 20:53
Оценка:
Не дадите ли мне ответ на следующий вопрос.
Возьмем для примера компилятор от Microsoft для С++. Когда компилится исходник и в нем описаны, но не определены скажем функция или глобальная переменная (через extern), то в объектном файле видимо должна быть инфа – типа вот по такому-то и такому-то адресу на этот символ имеется ссылочка. А потом линкер в одном объектном файле находит такую инфу, а в другом соответственно такую – вот по этому адресу есть такой-то символ (как раз что нам нужен). Прописывает этот адресочек (ну конечно со всеми смещениями) в первый файл и все хорошо.
Так вот хотелось бы узнать где эта инфа в объектном файле хранится. В конце объектного файла есть COFF таблица символов. Но ее изучение тем же PEDUMPом показывает что символы там лишь описаны как определенные в данном файле или UNDEF. А никаких адресов например для неразрешенных символов не указано. Как линкер узнает потом куда прописывать адрес неопределенного символа. Инфа CodeView относится к отладке кажется и в поиске внешних символов вроде бы не участвует.


13.06.05 16:42: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Внешние символы и COFF формат
От: Сергей Мухин Россия  
Дата: 13.06.05 03:49
Оценка:
Здравствуйте, Fylhe, Вы писали:

F>Не дадите ли мне ответ на следующий вопрос.

F>Возьмем для примера компилятор от Microsoft для С++. Когда компилится исходник и в нем описаны, но не определены скажем функция или глобальная переменная (через extern), то в объектном файле видимо должна быть инфа – типа вот по такому-то и такому-то адресу на этот символ имеется ссылочка. А потом линкер в одном объектном файле находит такую инфу, а в другом соответственно такую – вот по этому адресу есть такой-то символ (как раз что нам нужен). Прописывает этот адресочек (ну конечно со всеми смещениями) в первый файл и все хорошо.
F>Так вот хотелось бы узнать где эта инфа в объектном файле хранится. В конце объектного файла есть COFF таблица символов. Но ее изучение тем же PEDUMPом показывает что символы там лишь описаны как определенные в данном файле или UNDEF. А никаких адресов например для неразрешенных символов не указано. Как линкер узнает потом куда прописывать адрес неопределенного символа. Инфа CodeView относится к отладке кажется и в поиске внешних символов вроде бы не участвует.

сдреса появляются, только когда определен адрес загрузки, т.е. линкер определяет их. а так по именам ищется. вообщем см MSDN PE Format
---
С уважением,
Сергей Мухин
Re[2]: Внешние символы и COFF формат
От: Fylhe Россия  
Дата: 13.06.05 07:54
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:


СМ>сдреса появляются, только когда определен адрес загрузки, т.е. линкер определяет их. а так по именам ищется. вообщем см MSDN PE Format


Боюсь мой вопрос не по PE формату, а именно по COFF объектным файлам. Понятно что линкер определяет адреса но он лишь добавляет по определенным адресам константу, а с точностью до константы это видимо делает компилятор. Если в коде где-то имеется вызов функции (не из DLL, а из "другого объектного файла") то как потом линкер находит какой туда адрес вставлять?
Re[3]: Внешние символы и COFF формат
От: Сергей Мухин Россия  
Дата: 13.06.05 08:20
Оценка:
Здравствуйте, Fylhe, Вы писали:


СМ>>сдреса появляются, только когда определен адрес загрузки, т.е. линкер определяет их. а так по именам ищется. вообщем см MSDN PE Format


F>Боюсь мой вопрос не по PE формату, а именно по COFF объектным файлам. Понятно что линкер определяет адреса но он лишь добавляет по определенным адресам константу, а с точностью до константы это видимо делает компилятор. Если в коде где-то имеется вызов функции (не из DLL, а из "другого объектного файла") то как потом линкер находит какой туда адрес вставлять?


Боюсь, что Вы не читали документа, а ведь его полное название "Microsoft PE and
COFF Specification". PE & COFF сыновья-братья, просто некоторые поля актуальны там, а некоторые сям (а некоторые и там и сям). Как говорилось в старые времена "Я Солженицена не читал, но я его обвиняю".

Если имя не определно в данной единице компиляции, то имеется внешнее имя, строка. А в той ед.компиляции где это имя определено, так же имеется строка, вот по этой самой строке их и ловят.

Можно воспользоваться DUMPBIN и посмотреть .obj поближе.

Но зачем все это Вам?
---
С уважением,
Сергей Мухин
Re: Внешние символы и COFF формат
От: Аноним  
Дата: 13.06.05 21:06
Оценка:
Здравствуйте, Fylhe, Вы писали:

F>Не дадите ли мне ответ на следующий вопрос.

F>Возьмем для примера компилятор от Microsoft для С++. Когда компилится исходник и в нем описаны, но не определены скажем функция или глобальная переменная (через extern), то в объектном файле видимо должна быть инфа – типа вот по такому-то и такому-то адресу на этот символ имеется ссылочка. А потом линкер в одном объектном файле находит такую инфу, а в другом соответственно такую – вот по этому адресу есть такой-то символ (как раз что нам нужен). Прописывает этот адресочек (ну конечно со всеми смещениями) в первый файл и все хорошо.
F>Так вот хотелось бы узнать где эта инфа в объектном файле хранится. В конце объектного файла есть COFF таблица символов. Но ее изучение тем же PEDUMPом показывает что символы там лишь описаны как определенные в данном файле или UNDEF. А никаких адресов например для неразрешенных символов не указано. Как линкер узнает потом куда прописывать адрес неопределенного символа. Инфа CodeView относится к отладке кажется и в поиске внешних символов вроде бы не участвует.

У каждой программной секции (например, text или data) есть, наряду с данными, т.н. relocation information (как по-русски, не знаю, но как-то наверняка). Эти таблицы географически привязаны к своим секциям, и содержат ровно ту информацию, о которой вы говорите:
— смещение в секции
— тип relocation (их много, зависит от "фиксируемой" инструкции)
— символ (или секция), относительно которого делается fixup
На символ ссылаются по номеру в таблице символов.

Для того, чтобы достучаться до этих таблиц, нужно прочитать таблицу секций (она лежит сразу после заголовка COFF) и узнать, где в файле размещена интересующая секция, сместиться в нужное место и прочитать ее заголовок. В нем, среди прочего, будет сказано, где — от начала секции — живет relocation table.
Re[2]: Внешние символы и COFF формат
От: Fylhe Россия  
Дата: 16.06.05 16:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У каждой программной секции (например, text или data) есть, наряду с данными, т.н. relocation information (как по-русски, не знаю, но как-то наверняка). Эти таблицы географически привязаны к своим секциям, и содержат ровно ту информацию, о которой вы говорите:

А>- смещение в секции
А>- тип relocation (их много, зависит от "фиксируемой" инструкции)
А>- символ (или секция), относительно которого делается fixup
А>На символ ссылаются по номеру в таблице символов.

А>Для того, чтобы достучаться до этих таблиц, нужно прочитать таблицу секций (она лежит сразу после заголовка COFF) и узнать, где в файле размещена интересующая секция, сместиться в нужное место и прочитать ее заголовок. В нем, среди прочего, будет сказано, где — от начала секции — живет relocation table.


Спасибо, видимо это то что нужно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.