Intereting Posts
Чтение строки переменного размера и разбиение ее содержимого на отдельные строки с текстом как указать, какой терминал используется при запуске gtk Почему используется некоторое пространство файловой системы, даже если файловая система пуста? Как изменить команды двоеточия vim по умолчанию? Как создать виртуальный вывод в PulseAudio? Создание каталога на внешнем жестком диске через командную строку (SSH) в Linux Закрытие всех окон Nautilus с терминала Автозаполнение имени файла в каталоге GRUB не может найти окна ESP Отправить письмо от сценария оболочки используя awk, чтобы разделить строку на одиночные пробелы, не кратные Какое имя приложения отображает пользовательский текст в полноэкранном размере? Bumblebee не смог включить дискретную графическую карту после пробуждения от приостановки Arch Linux: неудовлетворенные зависимости: open-vm-tools-modules требует linux <3.10 Как правильно перемещать веб-ссылки из моего браузера в папку с помощью перетаскивания в Debian с помощью KDE? (названия страниц не показаны)

Использование gdb для проверки переменных среды

Я пытаюсь найти адрес переменной среды SHELL в программе на машине Ubuntu 12.04. Я отключил ASLR.

Я нашел похожие сообщения: SO вопрос и сообщение в блоге

Я попытался использовать следующее в gdb

(gdb) x/s *((char **)environ) 

но я получаю сообщение:

  (gdb) No symbol "environ" in current context 

Это не относится к Ubuntu 12.04? Есть ли другой способ проверить адрес переменной среды в процессе с помощью gdb?

Разве ваш двоичный код был полосным символом? Если это так, таблицы символов не будет, и вы не найдете надежды найти этот символ. Вы можете узнать это с помощью readelf – здесь у моего readelf есть своя таблица символов:

 $ readelf -S hello | grep -i symtab [28] .symtab SYMTAB 0000000000000000 000018f8 $ 

Также, когда вы запускаете GDB, ваша программа действительно началась? Похоже, что этот символ не разрешается, пока таблица символов не загрузится. Он не будет загружен при первом запуске GDB, но должен быть к тому времени, когда вы нажмете main() . Вы можете просто поставить точку останова на main() , run программу, а затем проверить переменную, когда вы нажмете на точку main() :

 Reading symbols from hello...(no debugging symbols found)...done. (gdb) x/s *((char **)environ) No symbol table is loaded. Use the "file" command. (gdb) b main Breakpoint 1 at 0x4005c8 (gdb) r Starting program: /home/ubuntu/hello Breakpoint 1, 0x00000000004005c8 in main () (gdb) x/s *((char **)environ) 0x7fffffffe38f: "XDG_VTNR=7" (gdb) 

В gdb вы можете использовать show environment команды. Также в качестве альтернативы для изучения среды процесса:

 $ sed 's/\x0/\n/g' /proc/<PID>/environ 

Команда sed необходима для преобразования разделителей NUL в символы новой строки для удобства чтения.

Преимущество любого из этих подходов (помимо простоты) состоит в том, что не имеет значения, лишена ли ваша таблица символов или нет 🙂