2016-05-25 3 views
2

Я отладки аварии в Linux, и я собираюсь через узел функции cxa_finalizeНедоступен код в сборке

Катастрофа происходит на исходной строки, которая появляется недостижим:

cmp %edx,%esi    // f >= &funcs->fns[0] 
jae 0xb6e17b88   // enter for loop 
jmp 0xb6e17c08   // exit for loop 
lea 0x0(%esi,%eiz,1),%esi // crashes here - how do we even get here since there is a 
          // jmp above us, and nothing jumps to here 
cmp %edi,0xc(%esi)  // d == f->func.cxa.dso_handle (jumped to from below) 

позже в этом методе есть еще одна инструкция lea 0x0(%esi,%eiz,1),%esi, которая появляется после jmp и nop, которая также представляется недоступной. В этом случае jmp также выходит из цикла for.

Есть ли какая-то парадигма, которая содержит недостижимые инструкции?

Редакция: Оказалось, что это не сбой в команде lea, но по команде cmp после нее, при обращении к памяти на esi.

+3

Это может быть просто мусор, который ваш отладчик разбирает с удобочитаемыми инструкциями. Это может произойти по разным причинам. –

+1

Это поможет узнать адреса этого кода. Знаете ли вы, например, что команда jae 0xb6e17b88' - это не просто переход на инструкцию 'jmp' к инструкции' lea'? – davidbak

+2

Это может быть и цель другого прыжка. «Lea» - это просто дополнение для выравнивания, между прочим, так что этого действительно не может быть достигнуто. – Jester

ответ

4

Я нашел ответ here

Иногда GCC вставляет инструкции NOP в кодовом потоке, чтобы обеспечить правильное выравнивание и тому подобное. Инструкция NOP занимает один байт, поэтому вы могли бы подумать, что можете просто добавить столько, сколько необходимо. Но, по словам Яна Лэнса Тейлора, для чипа быстрее выполнить одну длинную инструкцию, чем многие короткие инструкции. Поэтому вместо того, чтобы вставлять семь инструкций NOP, вместо этого они используют один bizarro LEA, который использует семь байтов и семантически эквивалентен NOP

+4

Geez, если бы слово «bizarro» не было в цитате, я бы сделал этот комментарий. – davidbak

+2

Если код заливки выравнивания должен быть недоступен в любом случае, есть ли какое-либо преимущество при заполнении одной инструкцией LEA в bizarro, а не в серии инструкций NOP? –

+0

@IanAbbott: Это * возможно * не имеет значения. Он все равно может быть декодирован в том же цикле, что и jmp, что делает его недоступным. IDK, если процессоры Intel SnB-семейства будут выделять новую кэш-линию uop для хранения этих декодированных uops, если они понадобятся позже. (Он не знает, до тех пор, пока он не расшифрует их, что они «nop's», и в случае, не относящемся к «nop», вероятно, что что-то скоро перескочит туда.) Таким образом, возможно, это может спасти декодирование цикла или пространства в кэше uop. –

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