Как определить размер функции в памяти.

Тема в разделе "WASM.BEGINNERS", создана пользователем featurelles, 24 окт 2009.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Доброе утро, хотел узнать.
    Как можно узнать программными способами(не дизассемблируя библиотеки...) сколько байт, занимает любая - мной написанная функция?
    Примеры на си пожалуйста)
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Размер = адрес следующей функции - адрес вашей функции.
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Partner
    Тоесть, когда будет скомпилированна моя программа то функции будут расположены последовательно? друг за другом?.... чтото я не совсем понимаю).. как узнать следующую функцию? тоесть если допустим есть функция print() c опкодом..скажем 1516re54165rh6er16 и функция lalalal с опкодом 99999999999999..и есть ещё разные функции.printk и тд...
    и есть мой код... который скажем выглядит так.
    print();
    lalalal();
    ....и до чёртиков других функций...
    то компилятор положит в сегмент данных функции в порядке их вызова?
    тоесть сегмент будет выглядить так? 1516re54165rh6er16 99999999999999 и далее опкод других функций.... так?


    И ещё вопрос) как узнать размер функции ядра...) (эт в linux)
     
  4. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    featurelles
    Опкод - код операций процессора, к функциям отношения не имеет.

    По сабжу - выдели сигнатуру конца ф-ции (закрытие кадра стека, ret или ещё как-нибудь), и считай до неё.
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    featurelles
    это можно сделать программно только если ты сам пишешь функцию - пишешь вторую функцию которая расчитывает разницу между адресами метки которую ты сам ставишь в конце функции и ее началом

    иначе никак - ret недостаточный признак конца функции
    может быть и очень часто есть такой вариант


    $exit:
    ...
    ret
    $some:
    ...
    jmp $exit
    just_after label byte

    как в таких услових ты будешь искать адрес just_after ??? только в дизасме
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Clear__Energy
    сигнатура может стоять совсем не в конце ....
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Partner
    тоже частный случай ....
     
  8. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Rockphorr
    Спасибо, буду стандартными способами искать этот размер (push,,jmp)
     
  9. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    идёшь от начала ф-ции дизасмом вниз
    ищёшь ret
    идёшь по переходам из ф-ции (напр джампы)
    кол-во джампов за пределы ret должны соответствовать кол-ву ret
     
  10. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    featurelles
    не факт, что вообще можно найти "начало" и "конец" функции. Многие компилеры, например Watcom этим страдает, могут раскидать код на свастики, не только такие, как в №5, а, например, кинуть одну функцию посредине другой, объединить общий код двух функций, так, что вообще понятие код ОТДЕЛЬНОЙ функции теряет смысл. В общем, от С такого со стопроцентной гарантией никак не получить.

    Jupiter
    Хорошая идея, но этак и до disasm-движка недалеко :)
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    ну вот пример
    Код (ASM):
    1. my1 proc
    2. ...
    3. jmp $exit
    4. my1 endp
    5. data_in_code n dup (?)
    6. my2 proc
    7. ...
    8. $exit label near
    9. ret
    10. my2 endp
    что вам даст разница между началами 2х функций ???
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    featurelles
    пожалуста, только пуши и джампы вам не помогут вам надо найти разницу между смещением грамотно поставленой вами метки и началом функции, саму функцию написать так чтоб код был без извращений (всяких там гнёзд и прочих фокусов)
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! А скажите пожалуйста где в коде найти начало моей функции?
    Ну, то есть я понимаю, иной раз отладчик в этом помогает- выделяет жирными скобками тела функций.
    Иной раз смотришь, какие значения кладутся в стек и сравниваешь со значениями, которые прописаны в исходнике.
    Можно посмотреть в отладчике, встроенном в среду программирования адрес функции...

    Но это всё как-то не того... Меня интересует- прописано ли где-нибудь в *exe имя моей функции? Что-то типа структуры из двух полей состоящей, первое поле- указатель на имя функции, второе- на её начало.
     
  14. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Это называется отладочная информация. В release она не пишется.
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в общем случае конечно никак.
     
  16. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    вообще во многих старых компияторах обертки дос сервисов были зашиты с "гнездованием" как щас не знаю

    2 или 3 - вопрос вкуса

    разность двух функций плоха только тем что может включать в себя не только функцию но и окружающий "мусор"

    а в остальном все тип топ
     
  17. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    amvoz

    Как вариант можно просто сделать: 'printf("%X\n", printf);'. Можно то же самое и со структурами. Другое дело, что это надо вручную писать.
     
  18. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Короче, всё плохо. Спасибо.
     
  19. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Тупые советы

    По поводу размера функции. Скомпелировать проект, закоментить тело функции оставив stub и пощитать разницо, чтобы не было разницо скрыта aligment'ом - накопировать этих функций столько чтобы точно вылазили за выравнивание и повторить сначало.

    Найтить свою функцию. Ну опять-таки можно инлайн асмом засунуть какой-нить pattern и потом яго искать. Можно из своей функции вызывать спецальную функцию GetOffset, которая всегда будет знать где она находицца и по дельте вычислять VA и Physical если эта тоже нужна.

    Ну еще много че на ум приходит, все сразу не напишешь.
     
  20. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    без коментариеффф .....