Запретить GCC генерировать инструкцию вызова как последнюю инструкцию функции

После перехода на GCC 4.8 мы заметили, что код некоторых функций заканчивается инструкцией вызова, например:

0000000000000167 <function_a>:
167:   55                      push   %rbp
168:   89 fe                   mov    %edi,%esi
16a:   48 8d 3d 00 00 00 00    lea    0x0(%rip),%rdi        # 171 <function_a+0xa>
16d: R_X86_64_PC32      .LC0-0x4
171:   31 c0                   xor    %eax,%eax
173:   48 89 e5                mov    %rsp,%rbp
176:   e8 00 00 00 00          callq  17b <function_a+0x14>
177: R_X86_64_PLT32     function_c-0x4
17b:   48 8d 0d 00 00 00 00    lea    0x0(%rip),%rcx        # 182 <function_a+0x1b>
17e: R_X86_64_PC32      .rodata+0x6afc
182:   48 8d 35 00 00 00 00    lea    0x0(%rip),%rsi        # 189 <function_a+0x22>
185: R_X86_64_PC32      .LC1-0x4
189:   48 8d 3d 00 00 00 00    lea    0x0(%rip),%rdi        # 190 <function_a+0x29>
18c: R_X86_64_PC32      .LC2-0x4
190:   ba 88 00 00 00          mov    $0x88,%edx
195:   e8 00 00 00 00          callq  19a <function_b>
196: R_X86_64_PLT32     __assert_fail-0x4

000000000000019a <function_b>:
19a:   55                      push   %rbp
...

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

Есть ли способ запретить GCC генерировать этот тип функции конца?

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector