Как выяснить, какой ассемблер использует мой сервер - PullRequest
1 голос
/ 07 апреля 2020

Какой самый простой способ определить, какой asm использует сервер? Например, у меня есть следующая C программа:

int main(void) {                                                                                                                                 
    int i = 4;
    return i;
}

И скомпилирована для сборки через $ gcc -S main.c Я получаю:

  1   .file "main.c"                                                                                                                                 
  2   .text
  3   .globl  main
  4   .type main, @function
  5 main:
  6 .LFB0:
  7   .cfi_startproc
  8   pushq %rbp
  9   .cfi_def_cfa_offset 16
 10   .cfi_offset 6, -16
 11   movq  %rsp, %rbp
 12   .cfi_def_cfa_register 6
 13   movl  $4, -4(%rbp)
 14   movl  -4(%rbp), %eax
 15   popq  %rbp
 16   .cfi_def_cfa 7, 8
 17   ret
 18   .cfi_endproc
 19 .LFE0:
 20   .size main, .-main
 21   .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
 22   .section  .note.GNU-stack,"",@progbits

Я хотел бы использовать https://godbolt.org/, чтобы выбрать ближайший язык для компиляции в сети, но я не уверен, какой из них выбрать (или даже как выяснить, как я могу это определить). В основном все, что я знаю, это «похоже на синтаксис ATT». Как я могу понять это?

1 Ответ

2 голосов
/ 07 апреля 2020

G CC идентифицирует себя через метаданные ; в asm это директива .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4".

Вы могли бы увидеть то же самое через gcc -v, чтобы просто напечатать свою версию G CC.

Это говорит о том, что ваш сервер использует старый хрустящий G CC 4.8.4. (Я бы действительно рекомендовал использовать более новый компилятор, если вы заботитесь об оптимизации; например, g cc 8 ввел более простую автоматическую векторизацию, которая лучше подходит для выровненных массивов, и позволяет аппаратному обеспечению обрабатывать смещение, просто используя невыровненные нагрузки.)

Таким образом, https://godbolt.org/ вы можете получить идентичный asm, который вы получаете локально, установив версию компилятора C на x86-64 G CC 4.8.4 и используя -fstack-protector-strong. (поскольку Ubuntu настраивает G CC для использования этой опции). Обычно вы также должны использовать -Wall -O2 как минимум или -O3; смотреть на неоптимизированный асм, как правило, пустая трата времени. См. Как убрать "шум" из вывода сборки GCC / clang? - особенно ссылку на выступление Мэтта Годболта на CPPcon.)

Выберите C или C ++ в качестве "языка" на Годболте ; в системе Ubuntu будут установлены g cc и g ++ 4.8.4.

В более поздних версиях Ubuntu включите -fPIE как часть параметров по умолчанию, так что у вас также будет возможность чтобы включить это вручную на Godbolt, чтобы соответствовать тому, что вы видите локально. Но я думаю, что 14.04 слишком стар для этого.

(Мы можем сказать, что это x86-64, потому что указатель стека - это RSP, а не ESP. И да, G CC в x86 по умолчанию использует синтаксис AT & T, если только вы используйте -masm=intel. По умолчанию в проводнике компилятора Godbolt включена эта опция вывода. Тем не менее, это просто другой текстовый синтаксис для одних и тех же машинных инструкций; если вы знаете, как читать оба, разница не имеет значения.)

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. * * * * * * * * * * * * * * * * * * * "*" Не "* *" возможно"Godbolt" скомпилирует с немного отличающимися версиями заголовка; Я думаю, что в его настройке установлены разные компиляторы с использованием заголовков из одной установки, вместо того, чтобы у каждой была своя собственная. Хотя я могу ошибаться по этому поводу. Обычно это нормально.

...