2016-12-01 4 views
0

Я хотел бы изменить глобальные структуры в файле ELF. Сначала я хотел бы узнать, является ли глобальная переменная структурой или нет? Но единственная информация, которую я вижу, - это имя и размер переменной.Как найти тип переменной в файле ELF?

+2

Сведения о типе будут храниться только в отладочной информации; информация не нужна, если программа запускается иначе. То, что вы делаете, похоже, ошибочно - ожидайте неудачи. Код с использованием структуры будет тесно связан с формой/размером структуры, которая использовалась при компиляции источника. Если вы измените это, ваша программа будет работать неправильно. –

+2

В файле ELF нет «переменных» или «типов». Это концепции исходного кода. Файл ELF содержит только объемные данные и символы, указывающие на начало данных. Если вам нравится, все файлы эльфа имеют 'char []' и 'void *'. –

+0

Почему вы спрашиваете? Ваш вопрос непонятен (строгое определение ELF определяет его структуру) и, вероятно, будет проблемой [XY] (http://xyproblem.info). Поэтому вы должны ** изменить свой вопрос **, чтобы мотивировать его, объясните больше. –

ответ

5

Вы не можете найти его. Формат ELF имеет очень ограниченную информацию о типе (и не знает, является ли какая-либо глобальная переменная struct или int, она знает в основном переменную sizeof). См. elf(5).

Однако, если вы скомпилируете свою программу (и библиотеки, которые она использует) для поддержки отладки (например, с помощью g++ -Wall -g). то файл ELF содержит дополнительные разделы отладки, часто используя формат DWARF. Эта информация может быть удалена из файла ELF с помощью команды strip. См. strip(1) & readelf(1) & objdump(1).

Но вы действительно хотите использовать source code. Так что получите источник программы (так как Linux в основном состоит из free software, это вообще возможно) и перекомпилируйте его (и, конечно, изучите исходный код программы). Возможно, вы хотите (но это требует нескольких недель работы) для настройки вашего компилятора (например, путем написания собственного плагина GCC или использования GCC MELT или настройки вашего компилятора Clang) и использовать его для перекомпиляции кода (и обрабатывать конкретно все объявления глобальных переменных).

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