LINUX.ORG.RU
ФорумTalks

sizeof машкода функции - переносимое на си.

 


1

3

собственно

при sizeof(func) происходит деградация и в результате тоже что и

sizeof(&func)

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

итак?

Перемещено tailgunner из development

★★☆

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

переносимым образом - никак

разные архитектуры, разные компиляторы, оптимизации, флаги компилятора

да и вообще компилятор как бы заранее не знает

Harald ★★★★★
()

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

Harald ★★★★★
()
Ответ на: комментарий от Harald

т.е.

void func1()
{
...
}

void func2()
{
...
}

...
sizeof_func1 = func2 - func1;
Harald ★★★★★
()
Ответ на: комментарий от qulinxao

При чём тут tcc? ЕМНИС в любом C — func == *func и размер у него соответсвенно sizeof(void *).

beastie ★★★★★
()

размер в байтах(ну скажем char'ов) маш.кода заданой функции.

Никак. Код на Си можно просто в уме исполнять. Там никакого машинного кода не будет.

i-rinat ★★★★★
()
Ответ на: комментарий от true_admin

В программировании под винду, как-то нужно было через WriteProcessMemory прицепить функцию к процессу. В том числе необходимо было рассчитать размер функции для передачи в качестве параметра, этому самому WriteProcessMemory. Так что вопрос близок к практике.

P.S. использовался этот вариант: sizeof машкода функции - переносимое на си. (комментарий)

Deleted
()

Посмотреть ассемблерный листинг ф-ции, на основании которого вычислить её размер очевидным образом.

next_time ★★★★★
()
Ответ на: комментарий от Harald

tcc похоже линейно проходит и оптимизирует только тривиальщину. В худшем случае тс может собрать все адреса и сортирнуть их по возрастанию, т.о. получив все концы.

Но вообще ему стоит мыслить не менее, чем юнитами, и юзать что-то вроде https://github.com/LuaDist/tcc/blob/master/libtcc.h#L96

arturpub ★★
()

Функции вообще может не оказаться. Компилятор возьмет и соптимизирует в константу, и вуаля.

shimshimshim
()

Только посредством дорабатывания кода на ассемблере, который выплевывает компилятор.

Компилятор это помечает через https://sourceware.org/binutils/docs/as/Size.html#Size

Вот в ассемблерных листингах оно так выглядит так например

.Lfunc_end0:
        .size   main, .Lfunc_end0-main
или
.size   main, .-main
Где-то там в отладочных секциях может лежать этот размер, который через директиву .size только я не знаю, как его оттуда выцепить Cи-кодом в рантайме

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от Deleted

Обычный x86/x86-64 код часто зависит от того, по какому адресу он расположен, т.к. в коде могут быть как и переходы по абсолютным адресам так и прочие завязки на текущее значение регистра EIP / RIP. Position Independent Code будет генерировать код который будет точно работать, если его таким варварским методом скопировать куда-то (при условии что код самодостаточный).

qrck ★★
()

Кроме всего вышеперечисленного, компилятор может разбить функцию на части, сделать часть inline, а часть так. Тогда вообще непонятно, что у нее за размер.

Deleted
()
Ответ на: комментарий от qrck

А у мелкософтовского компилятора cl.exe есть такой флаг вообще? :) Я подозреваю, что нет. По крайней мере не помню такого

Harald ★★★★★
()

Никак. Страдай и вычисляй в рантайме.

hlebushek ★★
()

Никак. А зачем такое нужно? Можно анализировать obj файл и извлекать информацию из него, но это тоже нихрена не переносимо. Можно фунцию поместить в отдельный сегмент и получать размер сегмента средствами линкера.

vromanov ★★
()
Ответ на: комментарий от Iron_Bug

нет конечно! это же незаконно.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.