Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
#1

Адреса функций - C++

29.09.2009, 22:03. Просмотров 1236. Ответов 10
Метки нет (Все метки)

По каким правилам в памяти ОС(операционная система формирует адреса), как определяет что эта область памяти не занята и туда можно записывать
,
также как формируется адреса виртуальных функций в памяти при подключении dll
, например стандартная точка входа dll в программу обычно начинается с 0x10000000, а виртульные функции находятся на солидной дистанции в памяти объекта где-то в районе 0x100111xx, где xx-изменяемые значения(ну и больше разумеется) примерно отличается от точки входа в dll как минимум на 11000h примерно равно 69632байт. По идее указатель на функцию как правило равен 4 байтам, откуда берутся такие странные большие значения адресов относительно точки входа?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2009, 22:03     Адреса функций
Посмотрите здесь:

адреса C++
C++ Получить ip-адреса
Адреса e-mail C++ Builder
Определение IP-адреса C++ Builder
указатели и адреса. C++
C++ Адреса и указатели
IP адреса. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
29.09.2009, 22:24     Адреса функций #2
Что-то я не понял.... А при чем здесь "адреса виртуальных функций" и "при подключении dll" ? Как эти два момента связаны друг с другом? Они, вообще-то, совершенно ортогональны....

Что это за цитаты и откуда они?
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
29.09.2009, 22:30  [ТС]     Адреса функций #3
Цитата Сообщение от CheshireCat Посмотреть сообщение
Что это за цитаты и откуда они?
Ну вообщем я тут задал просто 2 совершенно разных вопроса и пометил их как цитаты, чтобы выделить их.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
29.09.2009, 22:57     Адреса функций #4
1. Адреса функций формирует (создает, рождает, генерирует.... синонимов добавить по вкусу) отнюдь не операционная система, а линкер той системы программирования, в которой собирается приложение. Каждому приложению в Windows и в *nix выделяется собственное, отдельное от других приложений виртуальное адресное пространство. Как именно линкер распределит функции по этому виртуальному адресному пространству - его внутреннее дело, в которое нам запускать свои шаловливые ручонки не след.
1.1. Большинство из известных мне линкеров последовательно объединяют в т.н. "секцию кода" (.code или .text) исполняемый код всех единиц компиляции, входящих в проект. Адреса функций при этом, как правило, выравниваются на границу в 16 байт и монотонно нарастают - в том порядке, как эти функции встречает линкер. Т.е, грубо говоря, адрес следующей функции = (адрес предыдущей функции + размер кода в байтах этой предыдущей функции, округленный до кратного 16 в большую сторону). Начальный адрес, от которого "пляшет" компилятор, как от печки, - зависит от ОС и установок компилятора, в Win32, например, это 0x00400000 - базовый адрес загрузки исполняемого файла. С DLL похожая история, только для них базовый адрес 0x10000000.
2. Виртуальные функции имеют смысл только в контексте разговора об объектах каких-либо классов. Если класс имеет виртуальные функции, то в "тело" объекта внедрен указатель на т.н. "таблицу виртуальных функций" (vmt или vft). Где именно будет расположена эта таблица - для каждого типа объектов своя - личное внутреннее дело линкера. Как правило, линкер кладет ее либо в секцию кода (.text), либо в секцию инициализированных констант (.rdata = read-only data).
Исполняемый файл (без разницы, exe или dll) делится на секции - сначала идет заголовок, потом секция кода (.code или .text), потом - .rdata, .idata, .data и т.д., начало каждой секции выравнивается по адресам, кратным 4 кбайт.

"В таком вот аксепте." (с) М.П.Камноедов.
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
29.09.2009, 23:18  [ТС]     Адреса функций #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
С DLL похожая история, только для них базовый адрес 0x10000000.
В Visual Studio с помощью def-файла или настроек линкера базовый адрес 0x10000000 можно заменить на другой, какие адреса(или в каких пределах) безопасно ставить?
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
29.09.2009, 23:37     Адреса функций #6
От 0x10000000 до, ежели мой склероз мне не изменяет, 0x7FFE0000 - подробности смотри у дедушки Рихтера. Впрочем, имей в виду, что загрузка DLL по заданному базовому адресу не гарантируется, - это только желаемый адрес загрузки, не более того; загрузчик ОС может его изменить при выполнении загрузки, исходя из наличия свободного региона памяти.
XuTPbIu_MuHTAu
Эксперт С++
2222 / 737 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
30.09.2009, 12:48     Адреса функций #7
CheshireCat, насколько я помню,установка флага /FIXED заставляет ОС загружать файл по строго определенному адресу или не загружать его вообще

Добавлено через 37 секунд
Для сборки DLL этот флаг по умолчанию снят,но поставить его можно
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
30.09.2009, 13:07     Адреса функций #8
Да, это именно так. Именно поэтому загрузка по заданному базовому адресу не гарантируется - если по базовому адресу есть свободный регион достаточного размера, чтобы загрузить модуль, загрузка будет выполнена именно туда; если нет, то либо - если флаг /FIXED не указан - загрузчик переместит модуль туда, где есть место, либо - если флаг /FIXED стоит - вообще не загрузит модуль. Короче, как карта ляжет.....
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
30.09.2009, 16:13  [ТС]     Адреса функций #9
Цитата Сообщение от Джеффри Рихтер
Особенности проецирования файлов на разных платформах
В Windows 98 представление всегда проецируется на раздел адресного пространства, расположенный в диапазоне от 0x80000000 до 0xBFFFFFFF.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
30.09.2009, 16:18     Адреса функций #10
Хм, а какое отношение это имеет к обсуждаемому вопросу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 15:29     Адреса функций
Еще ссылки по теме:

адреса C++
Адреса переменных C++
C++ смещения адреса
Отправка IP адреса C++ Linux
C++ Адреса и смещения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
RENXFIL
2 / 2 / 0
Регистрация: 22.04.2011
Сообщений: 103
20.09.2012, 15:29     Адреса функций #11
=)
...
Yandex
Объявления
20.09.2012, 15:29     Адреса функций
Ответ Создать тему
Опции темы

Текущее время: 09:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru