Re: Узнать адрес, откуда вызвали
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.06.23 05:09
Оценка: 4 (1) +2
Здравствуйте, пффф, Вы писали:

П>Есть ли возможность более или менее легально, без грязных хаков, узнать, откуда вызвали функцию?


Насколько грязным не должен быть хак?
https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

П>Предполагаем, что у нас фон-неймановская архитектура, стек растёт вниз — т.е. обычная винда или линукс на не экзотическом железе.


Куда растёт стек — пофиг.

П>Я краем уха слышал о способах передачи параметров, как стек организован, и тп, и вот что родилось:


П>1) При вызове функций компилятор складывает параметры на стек, затем вызывает функцию, при этом на стек помещается адрес возврата, т.е он у нас ниже последнего параметра


Почти. Только в соглашениях посовременнее стараются максимум передать в регистрах и только если этого недостаточно — класть на стек.

П>2) Все параметры кладутся на стек, расширяясь до int'а, как минимум. Тут не очень понятно, а на x64 как оно происходит, до какого размера расширяется параметр, до 4х байт или до 8им?


И снова тут.

П>3) Если у нас единственный аргумент, то отнимаем 4/8 байт от его адреса, и получаем адрес, где лежит адрес возврата, так?


Не совсем, см. 16-байтное выравнивание стека при вызове.

П>4) Если у нас несколько параметров, и мы в общем случае не знаем порядок их укладки на стек (stdcall/cdecl), то мы берём адреса крайних параметров и выбираем из них меньший, так?


Что такое "меньший"?

П>Тут не понятно, а как быть, если у функции нет параметров? Или функция — какая-нибудь fastcall, которая передаёт первый(ые) параметр(ы) в регистрах? Или, вроде, на x64 никакого fastcall для этого специально указывать не надо, там вроде стандартное соглашение о передаче параметров через регистр. Как быть?


Это решается или через регистр BP/EBP/RBP, или через отладочную информацию.

П>С передачей структур/классов по значению тоже не очень понятно, сколько в итоге они там места на стеке занимать будут.


И снова там же всё описано.

П>Что посоветуете?


Не изобретать велосипед, насколько возможно.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.