2013-09-10 5 views
2

Я, глядя на разборке исполняемым я просто построил, и я в замешательстве относительно того, что эта линия может значить:Branch и нести добавил компилятором

00000000 <func_foo>: 
    0: e1a0100d mov r1, sp 
    4: e59fd090 ldr sp, [pc, #144] 
    8: e92d4002 push {r1, lr} 
    c: eafffffe b c <func_foo+0xc> ;;; <<----- HERE 

Инструкция ветвь имеет кэрри бит (c) установлен, но он просто ветвится в себя. Он выглядит как бесконечный цикл, но я не вставлял этот код; он был полностью сгенерирован компилятором (GCC 4.6.3).

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

+0

Carry бит комплект? Как вы это видите? Можете ли вы показать источник C для своей функции? Как вы полагаете, эта инструкция, по-видимому, представляет собой бесконечный цикл. –

+2

Вы разбираете динамически связанный исполняемый файл и, таким образом, смотрите на заполнитель для вызова функции библиотеки, которая еще не была решена? – unixsmurf

+0

@unixsmurf может быть на правильном пути, хотя он не требует динамической компоновки. Если у вас есть хвостовой вызов функции из другой единицы перевода в конце 'func_foo', возможно, что компилятор испустит то, что вы видите. Можете ли вы показать источник? –

ответ

1

вы увидите BCS или ОЦК если это ветвь, если перенос установлен или ветвь, если проводить четкую, вы видите б 0хС который является текущим адресом.

Технически это ветвь для самостоятельной инструкции, кодировка не является конкретной или жестко закодированной до 0xC, это всего лишь ответвление на команды pc-2, так как компьютер является 2 инструкциями впереди, это ветвь для себя. (branch to instruction_address + 2 - 2 = branch to instruction_address)

Похоже, что вы разобрали объект, несвязанный код, основанный на адресе 0x00000 и этой ветви на себя. Когда вы связываетесь с чем-то другим, адрес должен измениться, и ветвь к себе изменится на ветвь на любую функцию, указанную в вашем источнике.

+0

Извинения. Результат, который вы видите здесь, является objdump. – MarkP

2

Инструкция не является «bc», но «b 0xc». (Инструкции ARM с первой шестнадцатеричной цифрой «E» являются безусловными инструкциями).

«< func_foo + 0xc>» - это информация, в которой говорится, что адрес 0xc (пункт назначения перехода) равен 0xc байтам после начала функции func_foo. Это имеет смысл в программах с несколькими функциями, где это не так просто видеть.

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