int x = 1;
return f();
}
int main() {
int x = g();
}
если скомпилировать (без линкежа) и посмотреть на таблицу символов:
$ gcc -c le1-1.c
$ nm le1-1.o
то получим:
U _f
0000000000000000 T _g
0000000000000020 T _main
а когда смотри на дамп объекта:
$ objdump -d le1-1.o
le1-1.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <g>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp)
f: b8 00 00 00 00 mov $0x0,%eax
14: e8 00 00 00 00 callq 19 <g+0x19>
19: c9 leaveq
1a: c3 retq
000000000000001b <main>:
1b: 55 push %rbp
1c: 48 89 e5 mov %rsp,%rbp
1f: 48 83 ec 10 sub $0x10,%rsp
23: b8 00 00 00 00 mov $0x0,%eax
28: e8 00 00 00 00 callq 2d <main+0x12>
2d: 89 45 fc mov %eax,-0x4(%rbp)
30: b8 00 00 00 00 mov $0x0,%eax
35: c9 leaveq
36: c3 retq
почему собственно в таблице адресс стоит 20 функции мейн в дампе 1b (вроде оба адреса относительно начала файла) ?
подзабыл.
Проделал ваш эксперимент. У меня nm выдал адрес 1b у main $ nm le1-1.o U f 0000000000000000 T g U _GLOBAL_OFFSET_TABLE_ 000000000000001b T main
Это не должно компилироваться
благодарю. видимо ошибка, это текстом из лекции. Проверил, адрес тот же, хотя у меня 1f, но это уже разница компиляторе, системе, командах и тд.
Обсуждают сегодня