2015-02-23 2 views
1

Я хотел бы знать, как просматривать аргументы командной строки, переданные функции с помощью gdb.Изучение строк с использованием gdb

Чтобы проверить это, я составил следующий код

.global main 
main: 
    pushl %ebp 
    movl %esp, %ebp 
    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

с

gcc -Wall -Wextra -g -m32 args.s 

вызывать ассемблер и компоновщик.

Моя система - x86_64 ubuntu (но для обучения я начал создавать 32-битные приложения).

Я начал GDB и передаются аргументы командной строки 2 с

start test 12345 

На данный момент я ожидал, что стек выглядеть следующим образом:

  • Адрес аргумента 2 < - $ EBP + 20
  • Адрес аргумента 1 < - $ ebp + 16
  • Адресное имя программы < - $ ebp + 12
  • ARGC < - $ EBP + 8
  • старый EIP < - $ EBP + 4
  • старый EBP < - $ EBP

Чтение аргумент счетчика

(gdb) x /d $ebp+8 

дает ожидаемые результаты:

0xffffd110: 3 

Теперь я попытался проверить аргументы командной строки, которые были переданы. Я ожидал

x /x $ebp+16 

, чтобы указать адрес первого символа первого переданного аргумента в памяти. Выход был:

0xffffd118: 0xb4 

Но когда я попытался получить доступ к этому региону

(gdb) x /x 0xb4 

я получил:

0xb4: Cannot access memory at address 0xb4 

Что приводит меня к выводу, что я пытался получить доступ к локации отличается от того места, где хранятся мои аргументы командной строки.

Может ли кто-нибудь дать мне несколько указателей на истинное местоположение аргументов командной строки?

ответ

2

Основная функция C принимает аргументы иным образом, чем первая вызываемая функция загрузчика Linux. Повторите декларацию main в C: int main(int argc, char *argv[]) (как указано в стандарте). Основная функция получит значение и указатель на массив строк, то есть указатель на несколько указателей на строку.

Tl; др:

argc: x /d $ebp+8 
argv[0]: x /s **(int)($ebp+12) 
argv[1]: x /s *(*(int)($ebp+12)+4) 
argv[2]: x /s *(*(int)($ebp+12)+8) 
Смежные вопросы