Во-первых, strcmp
- это стандартная библиотечная функция, поэтому gcc может свободно знать, как она работает.На самом деле это так;это редко генерирует библиотечный вызов.Вы можете попробовать -fno-builtin
отключить.
Во-вторых, вы сравниваете с унифицированными значениями.Это, я считаю, неопределенное поведение.Таким образом, компилятор может делать все, что пожелает, включая генерацию случайного кода.
Вы можете попробовать опцию -S
, чтобы gcc получил более подробную разборку (или, скорее, отсутствие сборки);альтернативно, если вы скомпилируете с помощью -g
(отладка), objdump -S
отобразит исходный код вместе с собранным кодом.
Вот пример, который я скомпилировал с помощью gcc -fno-builtin -g -O0 test.c -c
, а затем выгрузил с помощью objdump -S test.o
:
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
#include <string.h>
int main() {
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
const char foo[] = "foo";
8: 8b 05 00 00 00 00 mov 0x0(%rip),%eax # e <main+0xe>
e: 89 45 f0 mov %eax,-0x10(%rbp)
return strcmp(foo, "bar");
11: 48 8d 45 f0 lea -0x10(%rbp),%rax
15: be 00 00 00 00 mov $0x0,%esi
1a: 48 89 c7 mov %rax,%rdi
1d: e8 00 00 00 00 callq 22 <main+0x22>
}
22: c9 leaveq
23: c3 retq