Как дизассемблировать двоичный исполняемый файл в Linux, чтобы получить код сборки?

Мне сказали использовать дизассемблер. Есть ли в gcc что-нибудь встроенное? Какой самый простой способ сделать это?

62
задан Peter Cordes 31 July 2019 в 01:55
поделиться

2 ответа

Скажем, то, что Вы имеете:

#include <iostream>

double foo(double x)
{
  asm("# MyTag BEGIN"); // <- asm comment,
                        //    used later to locate piece of code
  double y = 2 * x + 1;

  asm("# MyTag END");

  return y;
}

int main()
{
  std::cout << foo(2);
}

Для получения ассемблерного кода с помощью gcc Вас может сделать:

 g++ prog.cpp -c -S -o - -masm=intel | c++filt | grep -vE '\s+\.'

c++filt demangles символы

grep -vE '\s+\.' удаляют некоторую бесполезную информацию

Теперь, если Вы хотите визуализировать теговую часть, просто используйте:

g++ prog.cpp -c -S -o - -masm=intel | c++filt | grep -vE '\s+\.' | grep "MyTag BEGIN" -A 20

С моим компьютером я добираюсь:

    # MyTag BEGIN
# 0 "" 2
#NO_APP
    movsd   xmm0, QWORD PTR -24[rbp]
    movapd  xmm1, xmm0
    addsd   xmm1, xmm0
    addsd   xmm0, xmm1
    movsd   QWORD PTR -8[rbp], xmm0
#APP
# 9 "poub.cpp" 1
    # MyTag END
# 0 "" 2
#NO_APP
    movsd   xmm0, QWORD PTR -8[rbp]
    pop rbp
    ret
.LFE1814:
main:
.LFB1815:
    push    rbp
    mov rbp, rsp
<час>

А более дружественный подход должен использовать: Проводник Компилятора

0
ответ дан 24 November 2019 в 16:38
поделиться

Можно довольно чертовски приблизиться (но никакая сигара) к генерации блока, который повторно соберется, если это будет тем, что Вы намереваетесь сделать, с помощью этого довольно сырого и утомительно длинного конвейерного приема (замените/bin/bash файлом, который Вы намереваетесь демонтировать и колотить. S с тем, что Вы намереваетесь отправить выводу в):

objdump --no-show-raw-insn -Matt,att-mnemonic -Dz /bin/bash | grep -v "file format" | grep -v "(bad)" | sed '1,4d' | cut -d' ' -f2- | cut -d '<' -f2 | tr -d '>' | cut -f2- | sed -e "s/of\ section/#Disassembly\ of\ section/" | grep -v "\.\.\." > bash.S

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

0
ответ дан 24 November 2019 в 16:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: