С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

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

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

Получить ip-адреса - C++
Можно ли получить ip-адреса клиентов в онлайновой игре? Любые внутренние или внешние.

Адреса и смещения - C++
Всем привет. Известен base address игры Нужно узнать любые адреса ( даже те у которых значения неизвестные, допустим позиция гг или...

Кодировка IP адреса - C++
Помогите пожалуйста закодировать IP адрес в с++:help:

Изменение mac адреса - C++
Стоит задача программно изменить mac адрес устройства. Помогите чем небуть url или примерчиком может кто то Даст вектор куда копать ))

Указания адреса функции - C++
Есть библиотека. Нужно чтобы функция в моей библиотеке указывала на функцию в чужой. Вот мой код: typedef int (WINAPI WJMP)(); ...

Выявление такого же ай-пи/мак адреса - C++
Усем здрасти!) имеется необходимость написать приложение, которое, бы присваивало ip адрес сетевой карте и менять ее мак-адресс. Но самое...

10
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
29.09.2009, 22:24 #2
Что-то я не понял.... А при чем здесь "адреса виртуальных функций" и "при подключении dll" ? Как эти два момента связаны друг с другом? Они, вообще-то, совершенно ортогональны....

Что это за цитаты и откуда они?
0
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
29.09.2009, 22:30  [ТС] #3
Цитата Сообщение от CheshireCat Посмотреть сообщение
Что это за цитаты и откуда они?
Ну вообщем я тут задал просто 2 совершенно разных вопроса и пометил их как цитаты, чтобы выделить их.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
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 кбайт.

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

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

[C++] Взятие адреса конструктора. Физическое время существование объекта. - C++
1. конструктор. class A { int a; public: A():a(555){}; ~A(){}

Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу - C++ Builder
Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу (V=4/3пиR2), конуса по радиусу основания и высоте...

Смена ip Адреса - C++ Builder
Всем привет! У меня возник такой вопрос. Возможно ли в Borland C++ сменить ip адрес? Я знаю что это можно сделать на Visual C++, а возможно...

Тест по Си: где правильно присвоены адреса функций указателям? - C (СИ)
Задали большой итоговый тест. С 2-мя вопросами затык. Где правильно присвоены адреса фунцкций указателям? Не понятно немного само задание...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.