2014-03-05 3 views
0

Предположим, у меня есть небольшая программа, как этот:Могу ли я перехватить инициализацию глобального указателя в C?

int i = 0; 
int *pi = &i; 
int **ppi = π 

int main(int argc, char *argv[]) { 
    return i + *pi + **ppi; 
} 

Есть ли способ, чтобы перехватить инициализацию pi и ppi, когда они установлены во время загрузки программы/настройки? Я хотел бы подключиться к их инициализации, чтобы я мог переписать значения указателя и вставить несколько своих собственных битов, если это возможно, прежде чем запускается main(). Все это должно быть прозрачным и автоматическим.

Я изучил интерфейс аудита LD (link), но предоставил только обратные вызовы для функций.

+3

В некоторых средах глобалы выделяются как часть байтов программы и уже инициализируются в изображении нагрузки. –

+2

Что вы действительно пытаетесь сделать? (Это может помочь дать ответ.) – TypeIA

+0

@dvnrrs: Отредактировал вопрос: я бы хотел поймать, когда они инициализированы, поэтому я могу вставить несколько пользовательских битов в значения указателя. – Jens

ответ

2

Это деталь реализации, а не часть языка. Возможно, есть способ сделать это, но тогда вы больше не будете писать в C.

И зачем вам это нужно? Если вам нужно сделать что-то прежде, чем main(), почему бы не просто преобразовать что-то вроде этого:

int main(int argc, char *argv[]) { 
    // Do stuff 
} 

к чему-то вроде:

int old_main(int argc, char *argv[]) { 
    // Do stuff 
} 

int main(int argc, char *argv[]) { 
    // Do earlier stuff 
    return old_main(argc, argv); 
} 

А зачем перехватывать инициализаторами? Просто дайте значения инициализировать, а затем измените их на то, что вы хотите.

Каждый раз, когда вы пытаетесь работать с языком вместо того, чтобы работать с ним, вы запрашиваете ошибки и непредсказуемое поведение.

+0

Буду рад изменить указатели после их инициализации. Задача состоит в том, чтобы найти все глобальные указатели, на что они указывают, и соответственно изменить их. Я полагаю, что где-то по пути к 'main()' указатели инициализируются, и это будет самый простой и общий способ поймать их _all_. – Jens

+0

Если «find» вы имеете в виду «найти их по имени», то это называется интроспекцией времени выполнения, которой у C нет. Имена переменных существуют только во время компиляции. Если вы еще не знаете, где они, нет возможности найти их позже. –

+0

Не по названию. В приведенном выше примере я объявляю два указателя, и в какой-то момент они инициализируются, чтобы указать на некоторый выделенный объект. Я ищу способ перехвата (или изменения в какой-то другой момент перед 'main()'), когда эти значения указателя установлены так, что как только 'main()' запускает тех, кто загружает 'pi' или' ppi', видит измененный указатели. – Jens

0

Вся программа c будет скомпилирована и связана компилятором, таким как GCC. Каждый компилятор может предоставить вам такие функции, как вызовы функции invoke и т. Д.

Как я знаю, функция invoke analysis может использовать эти функции. Если вы знаете китайца, вы можете посмотреть детали этого document.

Но я не нахожу способ привязать глобальные переменные. Эти переменные могут быть инициализированы компилятором при связывании шага области данных.

Смежные вопросы