Самостоятельная идентификация программы - PullRequest
0 голосов
/ 25 ноября 2010

Возможно ли, чтобы программа, написанная на C (или сборке), была связана с c stdlib с помощью gcc, чтобы напечатать адрес своей записи?(Поскольку символ _start обозначает запись программы, на самом деле я спрашиваю, возможно ли напечатать адрес этого символа из основной функции без анализа исполняемого файла ELF.)?

Ответы [ 4 ]

2 голосов
/ 25 ноября 2010

Я спрашиваю, зачем вам это нужно, но вы пытались использовать dlsym для своих целей?

1 голос
/ 25 ноября 2010

Не очень портативный (то есть работает на моей машине, хотя, возможно, это потому, что звезды выровнены)

#include <stdio.h>

extern void _start();

int main(int argc,char *argv[])
{
    printf("%p\n",_start);

    return 0;
}

В поле RHEL 5.5 x86_64 напечатанный адрес совпадает с точкой входа адреса в заголовке elf, я не удивлюсь, если это произойдет, если двоичный файл создан для использования рандомизации адресного пространства.

1 голос
/ 25 ноября 2010
extern void _start();
printf("%p\n", (void *)_start);

Это не «переносимо» в том смысле, что язык C не определяет такой вещи, как _start функция, но при условии, что она реализована таким образом, это должно работать.

0 голосов
/ 25 ноября 2010

Не переносимым способом, нет.

Используя ассемблер для известной платформы, вы, вероятно, могли бы шагнуть назад по стеку вызовов и записать адрес возврата (который должен быть внутри подпрограммы _start, если ваша платформа использует его) в переменную, доступную со стороны C .

Конечно, тогда у вас будет только адрес инструкции, следующий за call до main(), а не start подпрограммы _start.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...