Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.91
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
06.09.2011, 11:45     Адрес функции #1
Как узнать адрес функции? Посмотрел дизассемблер IDA. Очень удобная программа, но не могу разобраться, как получить адрес. Там вызов функции выглядит следующим образом:

Assembler
1
call    j_?CopyStr@@YAPADPBD@Z ; CopyStr(char const *)
Не совсем понятно, где реальный адрес.

И ещё вопрос: при каждом запуске программ адрес функции один и тот же или он может менятся?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2011, 11:45     Адрес функции
Посмотрите здесь:

IP-адрес! C++
Получение прототипа функции имея ее адрес C++
C++ Адрес функции
C++ Адрес
C++ Адрес функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
06.09.2011, 12:00     Адрес функции #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
void my_int_func(int x)
{
    printf( "%d\n", x );
}
 
int main()
{
    void (*foo)(int);
    /* the ampersand is actually optional */
    foo = &my_int_func;
 
    return 0;
}
Можно так. Для более широкого обзора гуглу понравилась строчка "function pointers". В данном случае адрес (IIRC/ЕМНИП) является относительным адресом внутри программы. Если не то, то сорри.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
06.09.2011, 12:03     Адрес функции #3
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
И ещё вопрос: при каждом запуске программ адрес функции один и тот же или он может менятся?
смотря какая функция, если внутренняя (объявленная в самом exe или статических библиотеках) - то постоянная (без перекомпиляции), если внешней линковки (dl) - то может меняться в зависимости от условий загрузки других библиотек (зависит от базового адреса итд)
koen
2 / 2 / 1
Регистрация: 16.08.2011
Сообщений: 3
06.09.2011, 13:10     Адрес функции #4
Цитата Сообщение от alex_x_x Посмотреть сообщение
смотря какая функция, если внутренняя (объявленная в самом exe или статических библиотеках) - то постоянная (без перекомпиляции)
Не слежу, но вроде винда тоже умеет ASLR...
Bash
1
2
3
4
5
bash-4.1$ gcc -W -Wall -ofoo  -pie  foo.c
bash-4.1$ ./foo && ./foo && ./foo
foo at 0x1419a934
foo at 0x14ac6934
foo at 0x1ab58934
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void
foo()
{
        printf("foo at %p\n", &foo);
}
 
int
main()
{
        foo();
 
        return 0;
}
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.09.2011, 18:34  [ТС]     Адрес функции #5
Почему-то адрес функции почти при каждом запуске разный.

Запускаю из exe-файла (без перекомпиляции).

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
#include <windows.h>
 
void func() {
}
 
int main(int argc, char * args[]) {
    printf("Address = %p\n", &func);
    system("pause");
    return 0;
}
Почему так?

Добавлено через 3 минуты
Прочитал про ASLR. Теперь понятно, почему адресы разные.
Yandex
Объявления
11.09.2011, 18:34     Адрес функции
Ответ Создать тему
Опции темы

Текущее время: 09:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru