Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодогенерация и адреса подпрограмм 
:(
    Опции темы
ТарасАтавин
Дата 7.9.2013, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Переменные, предположим, можно все разместить до подпрограмм и к этапу кодогенерации уже иметь готовые адреса. А как быть с подпрограммами? Если текущая подпрограмма должна вызвать следующую, то откуда может быть известно, по какому адресу её вызывать? Упорядочивать на основе того, какая подпрограмма какую вызывает, не получится из-за конструкций вида 
Код
void f1(...)
{
 ...
 f2(...);
 ...
}
void f2(...)
{
 ...
 f1(...);
 ...
}
, 
Код
procedure p (...)
...
begin
     ...
     ...:=f(...);
    ....
end;
function f(...):...
....
begin
     ...
     p(....);
     ...
end;
 и тому подобных перекрёстных вызовов. Как это обычно решается?


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
feodorv
Дата 7.9.2013, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(ТарасАтавин @  7.9.2013,  08:59 Найти цитируемый пост)
Упорядочивать на основе того, какая подпрограмма какую вызывает, не получится из-за конструкций вида 

Есть же декларация функции. Более того, в современных C/C++ она обязательна. 
Код

void f2(...);

void f1(...)
{
 ...
 f2(...);
 ...
}
void f2(...)
{
 ...
 f1(...);
 ...
}


Но даже в C в стиле K&R компилятор отнюдь не запутывался. Применяются специальные техники увязывания реального адреса функции и места её вызова.

Ситуация, на самом деле, ещё хуже, подумайте о динамических библиотеках. Подумайте и о том, что исполняемый код файла в создаваемом процессе может быть загружен не по тому адресу, на который рассчитывал компилятор. Но всё разрешается, всё работает)))

Добавлено через 5 минут и 54 секунды
Цитата(ТарасАтавин @  7.9.2013,  08:59 Найти цитируемый пост)
Переменные, предположим, можно все разместить до подпрограмм и к этапу кодогенерации уже иметь готовые адреса.

Вот такой код в отдельном модуле:
Код

extern int g_Count;

void GlobalReinit( void )
{
  g_Count = 0; 
}

Полагаете, что компилятор уже знает адрес переменной g_Count? 

Но вот линковщик уже должен знать этот адрес. При чём здесь "до подпрограмм"? Вы, случаем, не ассемблерщик?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ТарасАтавин
Дата 7.9.2013, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(feodorv @  7.9.2013,  11:13 Найти цитируемый пост)
Более того, в современных C/C++ она обязательна. 
Она и обязательна Но как это связано с размером текущей функции и стартовым адресом следующей? Или предварительная генерация асма обязательна для счёта размера?

Добавлено @ 12:12
Цитата(feodorv @  7.9.2013,  11:13 Найти цитируемый пост)
Полагаете, что компилятор уже знает адрес переменной g_Count? 
Речь шла о внутримодульных адресах и прямой адресации. С межмодульных потом разберусь. Скорей всего с помощью неявного превращения в ссылку, реализованную на указателе. Но для внутримодульных адресов это не подходит.

Это сообщение отредактировал(а) ТарасАтавин - 7.9.2013, 12:15


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
feodorv
Дата 7.9.2013, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(ТарасАтавин @  7.9.2013,  13:09 Найти цитируемый пост)
Но как это связано с размером текущей функции и стартовым адресом следующей?

Никак. А как связан порядок следования функций в исходниках с их адресами? Компилятор не обязан располагать коды функций в порядке их следования в исходниках. Он может руководствоваться какими-то своими резонами.

Цитата(ТарасАтавин @  7.9.2013,  13:09 Найти цитируемый пост)
Или предварительная генерация асма обязательна для счёта размера?

Не обязательна.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ТарасАтавин
Дата 7.9.2013, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(feodorv @  7.9.2013,  12:27 Найти цитируемый пост)
Компилятор не обязан располагать коды функций в порядке их следования в исходниках. 
Вот именно. Поэтому нефиг придумывать, что речь об исходнике, а не о порядке кодогенерации.

Добавлено через 1 минуту и 33 секунды
Цитата(feodorv @  7.9.2013,  12:27 Найти цитируемый пост)
Не обязательна. 
Тогда как?



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bems
Дата 7.9.2013, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



как насчет отложить часть символов на потом?
а вообще конечно нужно читать. например это


--------------------
Обижено школьников: 8
PM MAIL   Вверх
ТарасАтавин
Дата 7.9.2013, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(bems @  7.9.2013,  12:59 Найти цитируемый пост)
как насчет отложить часть символов на потом?
То есть? Вот отложил я часть тела функции, перешёл к следующей, сколько места займёт предыдущая не знаю. По какому адресу начинать следующую?



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bems
Дата 7.9.2013, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



не часть тела, а те символы, определить адрес которых в файле ты пока не можешь. адрес занимает фиксированный размер (пока для простоты не думай про оптимизацию размера адреса), поэтому ты можешь сгенерить переход на символ адрес которого пока неизвестен, а потом вернуться к этому месту и записать туда реальный адрес


--------------------
Обижено школьников: 8
PM MAIL   Вверх
feodorv
Дата 7.9.2013, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(ТарасАтавин @  7.9.2013,  13:40 Найти цитируемый пост)
Поэтому нефиг придумывать

Я ничего не придумывал  smile Это Ваши фантазии.

Цитата(bems @  7.9.2013,  14:05 Найти цитируемый пост)
потом вернуться к этому месту и записать туда реальный адрес 

Вот именно. 
Цитата(feodorv @  7.9.2013,  12:13 Найти цитируемый пост)
Применяются специальные техники увязывания реального адреса функции и места её вызова.




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ТарасАтавин
Дата 7.9.2013, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(feodorv @  7.9.2013,  11:13 Найти цитируемый пост)
Ситуация, на самом деле, ещё хуже, подумайте о динамических библиотеках.
Внешние вызовы как раз достаточно косвенны, чтоб не вызывать проблемы. 
Цитата(feodorv @  7.9.2013,  11:13 Найти цитируемый пост)
 Подумайте и о том, что исполняемый код файла в создаваемом процессе может быть загружен не по тому адресу, на который рассчитывал компилятор.
А это забота системы. Пусть как хочет, так и перебазирует, хоть анализирует код в поисках адресов внутримодульных переходов и исправляет. Или виртуализирует адреса каждого модуля. Меня это не касается.

Добавлено через 2 минуты и 32 секунды
Цитата(bems @  7.9.2013,  13:05 Найти цитируемый пост)
адрес занимает фиксированный размер (пока для простоты не думай про оптимизацию размера адреса)
Это как раз понятно. 
Цитата(bems @  7.9.2013,  13:05 Найти цитируемый пост)
поэтому ты можешь сгенерить переход на символ адрес которого пока неизвестен, а потом вернуться к этому месту и записать туда реальный адрес 
А где его искать потом, чтоб вставить? Кстати, к go to вперёд это тоже относится.


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bems
Дата 7.9.2013, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(ТарасАтавин @  7.9.2013,  16:48 Найти цитируемый пост)
 Пусть как хочет, так и перебазирует, хоть анализирует код в поисках адресов внутримодульных переходов и исправляет. Или виртуализирует адреса каждого модуля. Меня это не касается.
касается, потому что ты должен дать системе таблицу релоков



--------------------
Обижено школьников: 8
PM MAIL   Вверх
ТарасАтавин
Дата 7.9.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



что то новенькое. Вроде в формате были предусмотрены таблицы импорта и экспорта, а теперь ещё и реаллоков добавляется.

Это сообщение отредактировал(а) ТарасАтавин - 7.9.2013, 16:53


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bems
Дата 7.9.2013, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



секция .reloc

Добавлено через 9 минут и 19 секунд
Цитата(ТарасАтавин @  7.9.2013,  16:48 Найти цитируемый пост)
А где его искать потом, чтоб вставить? Кстати, к go to вперёд это тоже относится. 
добавлять в рабочие данные компилера список таких мест для каждого символа, адрес которого не известен, а потом при выяснении адреса проходить по этому списку?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
ТарасАтавин
Дата 7.9.2013, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Цитата(bems @  7.9.2013,  16:58 Найти цитируемый пост)
секция .reloc
Что это?

Это сообщение отредактировал(а) ТарасАтавин - 7.9.2013, 17:12


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bems
Дата 7.9.2013, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(ТарасАтавин @  7.9.2013,  17:11 Найти цитируемый пост)
Что это? 
что именно? "секция .reloc"? ну так часто называется секция РЕ-файла, содержащая таблицу релоков. "Часто" потому что насколько я помню загрузчик не использует имена секций для поиска нужной инфы, а пользуется массивом DataDirectory опционального заголовка. Релоки это это элемент массива за индексом IMAGE_DIRECTORY_ENTRY_BASERELOC



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.