GAS: JMP для обозначения результатов в неправильном прыжке? - PullRequest
3 голосов
/ 31 июля 2011

Я пытаюсь собрать следующую программу:

    .text
.globl _search2
_search2:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    %rax, -8(%rbp)
go_again:
    cmpl    $0x90909090, (%rax)
    je  go_out
    addq    $0x8, %rax
    jmp     go_again
go_out: 
    leave
    ret

выполнив это: "gcc -o test test.s main.c", и я получу это:

otool -v -t test

_search2:
0000000100000d0c    pushq   %rbp
0000000100000d0d    movq    %rsp,%rbp
0000000100000d10    movq    %rax,0xf8(%rbp)
go_again:
0000000100000d14    cmpl    $0x90909090,(%rax)
0000000100000d1a    je  0x100000d29
0000000100000d20    addq    $0x08,%rax
0000000100000d24    jmp 0x200000d14
go_out:
0000000100000d29    leave
0000000100000d2a    ret

jmp пытается перейти к адресу 0x200000d14, что совершенно неверно вместо 0x100000d29, помеченного меткой go_out.

Пожалуйста, помогите.

1 Ответ

2 голосов
/ 31 июля 2011

Попробуйте objdump -D test> test.list

00000000004004c4 <_search2>:
  4004c4:   55                      push   %rbp
  4004c5:   48 89 e5                mov    %rsp,%rbp
  4004c8:   48 89 45 f8             mov    %rax,-0x8(%rbp)

00000000004004cc <go_again>:
  4004cc:   81 38 90 90 90 90       cmpl   $0x90909090,(%rax)
  4004d2:   74 06                   je     4004da <go_out>
  4004d4:   48 83 c0 08             add    $0x8,%rax
  4004d8:   eb f2                   jmp    4004cc <go_again>

00000000004004da <go_out>:
  4004da:   c9                      leaveq 
  4004db:   c3                      retq   

Посмотрите, может ли инструмент, который вы используете, отображать инструкции, если инструкции (несколько) одинаковы, тогда относительный адрес правильный иВы можете игнорировать адрес, который отображает инструмент, или просто не использовать этот инструмент.

Если ветви прямые и не соответствуют цели, то возникает проблема с инструментами gcc / gnu.

...