SlideShare ist ein Scribd-Unternehmen logo
1 von 87
Downloaden Sie, um offline zu lesen
C++:
препроцессор,
компилятор,
компоновщик
Сомов Александр
C++ party, Новосибирск
Содержание
Сборка программы
Как устроен процесс сборки
Какие файлы создаются, как они устроены, что содержат
Особенности сборки C и C++
Использующиеся программы
Препроцессор и его отладка
Детали языка (inline, static и так далее)
Стандартная библиотека
3
Сборка и объектные файлы
4
int sum(int a, int b);
int main() {
int result = sum(1, 2);
return result * 2;
}
main.c
5
int sum(int a, int b) {
return a + b;
}
sum.c
$ gcc -o program main.c sum.c
$ ./program; echo $?
6
Собираем
6
$ gcc -c main.c
$ gcc -c sum.c
$ ls
main.c main.o sum.c sum.o
$ gcc -o program main.o sum.o
$ ./program; echo $?
6
Собираем
7
Объектные файлы
Содержимое
Машинный код
Секции дополнительных данных
– От чего зависит и какие зависимости предоставляет
– Как загружать
– Как запускать
Использование
Промежуточные объектные файлы
– Код отдельных частей программы
Исполняемый файл
8
Executable and Linkable
ОС
Linux
FreeBSD
Утилиты
objdump
– Binary File Descriptor library
readelf
9
$ gcc -c main.c
$ gcc -c sum.c
$ ls
main.c main.o sum.c sum.o
$ gcc -o program main.o sum.o
$ ./program; echo $?
6
Собираем
10
Процесс
Компиляция (compile)
C++ → машинный код
Один исходный файл → один объектный файл
Компоновка (link)
Объектные файлы → исполняемый файл
Сборка (build)
Всё вместе
11
Символы и релокации
12
sum.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <sum>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 89 7d fc ! mov %edi,-0x4(%rbp)
7:! 89 75 f8 ! mov %esi,-0x8(%rbp)
a:! 8b 45 f8 ! mov -0x8(%rbp),%eax
d:! 8b 55 fc ! mov -0x4(%rbp),%edx
10:! 01 d0 ! add %edx,%eax
12:! 5d ! pop %rbp
13:! c3 ! retq
objdump -d -r sum.o
13
main.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 48 83 ec 10 ! sub $0x10,%rsp
8:! be 02 00 00 00 ! mov $0x2,%esi
d:! bf 01 00 00 00 ! mov $0x1,%edi
12:! e8 00 00 00 00 ! callq 17 <main+0x17>
! ! ! 13: R_X86_64_PC32! sum-0x4
17:! 89 45 fc ! mov %eax,-0x4(%rbp)
1a:! 8b 45 fc ! mov -0x4(%rbp),%eax
1d:! 01 c0 ! add %eax,%eax
1f:! c9 ! leaveq
objdump -d -r main.o
14
Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS main.c
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 3
4: 00000000 0 SECTION LOCAL DEFAULT 4
5: 00000000 0 SECTION LOCAL DEFAULT 6
6: 00000000 0 SECTION LOCAL DEFAULT 7
7: 00000000 0 SECTION LOCAL DEFAULT 5
8: 00000000 33 FUNC GLOBAL DEFAULT 1 main
9: 00000000 0 NOTYPE GLOBAL DEFAULT UND sum
readelf -s main.o
15
Символы
Имя — произвольная строка
Значение — 64-битное число (адрес, смещение и т. д.)
Свойства
Тип
Видимость
– локальный символ
– глобальный символ
– внешний символ
16
Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS main.c
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 3
4: 00000000 0 SECTION LOCAL DEFAULT 4
5: 00000000 0 SECTION LOCAL DEFAULT 6
6: 00000000 0 SECTION LOCAL DEFAULT 7
7: 00000000 0 SECTION LOCAL DEFAULT 5
8: 00000000 33 FUNC GLOBAL DEFAULT 1 main
9: 00000000 0 NOTYPE GLOBAL DEFAULT UND sum
readelf -s main.o
17
Секции
18
main.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 48 83 ec 10 ! sub $0x10,%rsp
8:! be 02 00 00 00 ! mov $0x2,%esi
d:! bf 01 00 00 00 ! mov $0x1,%edi
12:! e8 00 00 00 00 ! callq 17 <main+0x17>
! ! ! 13: R_X86_64_PC32! sum-0x4
17:! 89 45 fc ! mov %eax,-0x4(%rbp)
1a:! 8b 45 fc ! mov -0x4(%rbp),%eax
1d:! 01 c0 ! add %eax,%eax
1f:! c9 ! leaveq
objdump -d -r main.o
19
Секции
Именованный блок данных в объектном файле
.text — код программы
.data — статически инициализированные данные
.symtab — таблица символов
Тип секции
Код
Статические данные
Таблицы символов
Таблицы строк
20
…
[ 1] .text PROGBITS PROGBITS 00000000 00000040 0 00000021
00000000 0 1 [00000006]: ALLOC, EXEC
…
[ 3] .data PROGBITS PROGBITS 00000000 00000061 0 00000000
00000000 0 1 [00000003]: WRITE, ALLOC
…
[10] .symtab SYMTAB SYMTAB 00000000 00000420 11 000000f0
00000018 8 8 [00000000]:
…
readelf -t main.o
21
Компоновщик
Оперирует секциями
Слить несколько секций в одну
Оставить один экземпляр
Определяет базовые адреса секций
Релоцирует код, используя символы
Формирует исполняемый файл
22
Исполняемый файл
23
000000000040050e <sum>:
40050e:!55 ! push %rbp
40050f:!48 89 e5 ! mov %rsp,%rbp
400512:!89 7d fc ! mov %edi,-0x4(%rbp)
400515:!89 75 f8 ! mov %esi,-0x8(%rbp)
400518:!8b 45 f8 ! mov -0x8(%rbp),%eax
40051b:!8b 55 fc ! mov -0x4(%rbp),%edx
40051e:!01 d0 ! add %edx,%eax
400520:!5d ! pop %rbp
400521:!c3 ! retq
objdump -d -r program
24
00000000004004ed <main>:
4004ed:!55 ! push %rbp
4004ee:!48 89 e5 ! mov %rsp,%rbp
4004f1:!48 83 ec 10 ! sub $0x10,%rsp
4004f5:!be 02 00 00 00 ! mov $0x2,%esi
4004fa:!bf 01 00 00 00 ! mov $0x1,%edi
4004ff:!e8 0a 00 00 00 ! callq 40050e <sum>
400504:!89 45 fc ! mov %eax,-0x4(%rbp)
400507:!8b 45 fc ! mov -0x4(%rbp),%eax
40050a:!01 c0 ! add %eax,%eax
40050c:!c9 ! leaveq
40050d:!c3 ! retq
objdump -d -r program
25
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 288 (bytes into file)
Flags: 0x0
readelf -h main.o
26
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400400
Start of program headers: 64 (bytes into file)
Start of section headers: 4456 (bytes into file)
Flags: 0x0
readelf -h program
27
Соглашение о вызове
(calling convention)
28
main.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 48 83 ec 10 ! sub $0x10,%rsp
8:! be 02 00 00 00 ! mov $0x2,%esi
d:! bf 01 00 00 00 ! mov $0x1,%edi
12:! e8 00 00 00 00 ! callq 17 <main+0x17>
! ! ! 13: R_X86_64_PC32! sum-0x4
17:! 89 45 fc ! mov %eax,-0x4(%rbp)
1a:! 8b 45 fc ! mov -0x4(%rbp),%eax
1d:! 01 c0 ! add %eax,%eax
1f:! c9 ! leaveq
objdump -d -r main.o
29
System V AMD64 ABI
Первые 6 целочисленных аргументов и указателей
rdi, rsi, rdx, rcx, r8, r9
Типы с плавающей точкой
xmm0-xmm7
Остальное на стеке
Возвращаемое значение
rax
30
Препроцессор
31
int sum(int a, int b);
int main() {
int result = sum(1, 2);
return result * 2;
}
main.c
32
int sum(int a, int b) {
return a + b;
}
sum.c
#include "sum.h"
int main() {
int result = sum(1, 2);
return result * 2;
}
main.c
33
int sum(int a, int b);
sum.h
# 1 "main.c"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.c"
# 1 "sum.h" 1
int sum(int a, int b);
# 2 "main.c" 2
int main() {
int result = sum(1, 2);
return result * 2;
}
gcc -E main.c
34
Препроцессор
Обрабатывает текст
#include — подстановка содержимого другого файла
– расширение не важно — хоть *.txt, хоть *.exe
– *.h — удобное соглашение
#ifdef/#endif — выборочное включение/исключение текста
35
Процесс сборки и
использующиеся программы
36
Сборка
Препроцессинг (preprocess)
C/C++ с директивами препроцессора → C/C++
Исходный файл + заголовочные файлы → один исходный
файл
Компиляция (compile)
C/C++ → машинный код
Один исходный файл → один объектный файл
Компоновка (link)
Объектные файлы → исполняемый файл
37
Программы
Препроцессор
cc1
Компилятор
cc1, as
Компоновщик
ld (collect2)
38
…
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch
x86_64-linux-gnu main.c -quiet -dumpbase main.c -
mtune=generic -march=x86-64 -auxbase main -version -
fstack-protector -Wformat -Wformat-security -o /tmp/
ccsJ9O2h.s
…
as -v --64 -o /tmp/ccPe5usI.o /tmp/ccsJ9O2h.s
…
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch
x86_64-linux-gnu sum.c -quiet -dumpbase sum.c -
mtune=generic -march=x86-64 -auxbase sum -version -
fstack-protector -Wformat -Wformat-security -o /tmp/
ccsJ9O2h.s
…
as -v --64 -o /tmp/ccSAbeU8.o /tmp/ccsJ9O2h.s
…
gcc -o program -v main.c
39
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --
build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --
as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z
relro -o program /usr/lib/gcc/x86_64-linux-gnu/
4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-
linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/
gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/
x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/
4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-
linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/
lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib
-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. /tmp/
ccPe5usI.o /tmp/ccSAbeU8.o -lgcc --as-needed -lgcc_s --
no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-
needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/
lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/
crtn.o
gcc -o program -v main.c
40
Сборка
Препроцессинг — сс1
С/C++ с директивами препроцессора → C++
Компиляция — cc1, as
С/C++ → ассемблер → машинный код
Один исходный файл → один объектный файл
Компоновка — ld (collect2)
Объектные файлы → исполняемый файл
41
Детали работы
препроцессора
42
#include "sum.h"
int main() {
int result = sum(1, 2);
return result * 2;
}
main.c
43
#include <sum.h>
int main() {
int result = sum(1, 2);
return result * 2;
}
main.c
"sum.h" vs <sum.h>
Разные списки директорий, в которых препроцессор ищет файл
Если файл "sum.h" не найден, он ищется как <sum.h>
Соглашение
"sum.h" — локальный файл
– Сначала ищется в текущей директории
<sum.h> — системный файл
44
…
ignoring nonexistent directory "/usr/local/include/x86_64-
linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-
gnu/4.8/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
…
gcc -o program -v main.c
45
Опции препроцессора
Директории
-Idir — добавить dir в начало обоих списков
-iquotedir — добавить dir в начало списка для #include
"file"
Отладка
-H — вывести дерево #include
-dM — вывести #define для всех предопределённых
переменных
-dD — оставить директивы #define в обработанном файле
-dI — оставить директивы #include в обработанном файле
-P — не генерировать номера строк
46
#include <stdio.h>
int main() {
puts("Hello, world!");
return 0;
}
main.c
47
. /usr/include/stdio.h
.. /usr/include/features.h
... /usr/include/x86_64-linux-gnu/sys/cdefs.h
.... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/gnu/stubs.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.. /usr/include/x86_64-linux-gnu/bits/types.h
... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/bits/typesizes.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h
.. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h
…
gcc -E -H main.c > main.i
48
$ wc main.i
841 2073 17138 main.i
49
Ошибки сборки
50
Ошибки сборки
Ошибки
multiple definition of `sum'
undefined reference to `sum'
too many arguments to function ‘sum’
Поиск причины
gcc -v — что компилируется и компонуется
gcc -E — результат препроцессинга, какие сигнатуры
используются
readelf -s — какие символы в объектном файле, какие
символы — внешние
objdump -d -r — где используются внешние символы
51
С++
52
int sum(int a, int b);
int main() {
int result = sum(1, 2);
return result * 2;
}
main.cpp
53
int sum(int a, int b) {
return a + b;
}
sum.cpp
sum.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_Z3sumii>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 89 7d fc ! mov %edi,-0x4(%rbp)
7:! 89 75 f8 ! mov %esi,-0x8(%rbp)
a:! 8b 45 f8 ! mov -0x8(%rbp),%eax
d:! 8b 55 fc ! mov -0x4(%rbp),%edx
10:! 01 d0 ! add %edx,%eax
12:! 5d ! pop %rbp
13:! c3 ! retq
objdump -d -r sum.o
54
$ echo _Z3sumii | c++filt
sum(int, int)
Декорирование (mangling)
55
sum.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <sum(int, int)>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 89 7d fc ! mov %edi,-0x4(%rbp)
7:! 89 75 f8 ! mov %esi,-0x8(%rbp)
a:! 8b 45 f8 ! mov -0x8(%rbp),%eax
d:! 8b 55 fc ! mov -0x4(%rbp),%edx
10:! 01 d0 ! add %edx,%eax
12:! 5d ! pop %rbp
13:! c3 ! retq
objdump -d -r -C sum.o
56
…
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1plus -quiet -v -
imultiarch x86_64-linux-gnu -D_GNU_SOURCE sum.cpp -quiet
-dumpbase sum.cpp -mtune=generic -march=x86-64 -auxbase
sum -version -fstack-protector -Wformat -Wformat-security
-o /tmp/cco5ypSz.s
…
gcc -v main.cpp sum.cpp
57
С++
inline
58
inline
int sum(int a, int b) {
return a + b;
}
int main() {
int result = sum(1, 2);
return result * 2;
}
main.cpp
59
inline
int sum(int a, int b) {
return a + b;
}
int calc() {
return sum(2, 3);
}
sum.cpp
Disassembly of section .text:
0000000000000000 <_Z4calcv>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! be 03 00 00 00 ! mov $0x3,%esi
9:! bf 02 00 00 00 ! mov $0x2,%edi
e:! e8 00 00 00 00 ! callq 13 <_Z4calcv+0x13>
! ! ! f: R_X86_64_PC32! _Z3sumii-0x4
13:! 5d ! pop %rbp
14:! c3 ! retq
objdump -d -r sum.o
60
Disassembly of section .text._Z3sumii:
0000000000000000 <_Z3sumii>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 89 7d fc ! mov %edi,-0x4(%rbp)
7:! 89 75 f8 ! mov %esi,-0x8(%rbp)
a:! 8b 45 f8 ! mov -0x8(%rbp),%eax
d:! 8b 55 fc ! mov -0x4(%rbp),%edx
10:! 01 d0 ! add %edx,%eax
12:! 5d ! pop %rbp
13:! c3 ! retq
objdump -d -r sum.o
61
…
[ 6] .text._Z3sumii PROGBITS PROGBITS 00000000 0000005d 0
00000014 00000000 0 1 [00000206]: ALLOC, EXEC, GROUP
…
readelf -t sum.o
62
С и C++
static
63
static int sum(int a, int b) {
return a + b;
}
sum.c
64
Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS sum.c
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 2
4: 00000000 0 SECTION LOCAL DEFAULT 3
5: 00000000 20 FUNC LOCAL DEFAULT 1 sum
6: 00000000 0 SECTION LOCAL DEFAULT 5
7: 00000000 0 SECTION LOCAL DEFAULT 6
8: 00000000 0 SECTION LOCAL DEFAULT 4
readelf -s sum.o
65
main.o: In function `main':
main.c:(.text+0x13): undefined reference to `sum'
collect2: error: ld returned 1 exit status
gcc -o program sum.o main.o
66
C++
extern "C"
67
extern "C" {
int sum(int a, int b) {
return a + b;
}
}
extern.cpp
68
Disassembly of section .text:
0000000000000000 <sum>:
0:! 55 ! push %rbp
1:! 48 89 e5 ! mov %rsp,%rbp
4:! 89 7d fc ! mov %edi,-0x4(%rbp)
7:! 89 75 f8 ! mov %esi,-0x8(%rbp)
a:! 8b 45 f8 ! mov -0x8(%rbp),%eax
d:! 8b 55 fc ! mov -0x4(%rbp),%edx
10:! 01 d0 ! add %edx,%eax
12:! 5d ! pop %rbp
13:! c3 ! retq
objdump -d -r extern.o
69
Стандартная библиотека
70
int sum(int a, int b);
int main() {
int result = sum(1, 2);
return result * 2;
}
main.c
71
int sum(int a, int b) {
return a + b;
}
sum.c
00000000004004ed <main>:
4004ed:!55 ! push %rbp
4004ee:!48 89 e5 ! mov %rsp,%rbp
4004f1:!48 83 ec 10 ! sub $0x10,%rsp
4004f5:!be 02 00 00 00 ! mov $0x2,%esi
4004fa:!bf 01 00 00 00 ! mov $0x1,%edi
4004ff:!e8 0a 00 00 00 ! callq 40050e <sum>
400504:!89 45 fc ! mov %eax,-0x4(%rbp)
400507:!8b 45 fc ! mov -0x4(%rbp),%eax
40050a:!01 c0 ! add %eax,%eax
40050c:!c9 ! leaveq
40050d:!c3 ! retq
objdump -d -r program
72
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400400
Start of program headers: 64 (bytes into file)
Start of section headers: 4456 (bytes into file)
Flags: 0x0
readelf -h program
73
Disassembly of section .text:
0000000000400400 <_start>:
400400: 31 ed xor %ebp,%ebp
400402: 49 89 d1 mov %rdx,%r9
…
40041d: 48 c7 c7 ed 04 40 00 mov $0x4004ed,%rdi
400424: e8 b7 ff ff ff callq 4003e0
<__libc_start_main@plt>
400429: f4 hlt
objdump -d -r program
74
__libc_start_main(…) {
argc = …
argv = …
some_libc_init();
exit(main(argc, argv));
}
__libc_start_main
75
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --
build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --
as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z
relro -o program /usr/lib/gcc/x86_64-linux-gnu/
4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-
linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/
gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/
x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/
4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-
linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/
lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib
-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. /tmp/
ccPe5usI.o /tmp/ccSAbeU8.o -lgcc --as-needed -lgcc_s --
no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-
needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/
lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/
crtn.o
gcc -o program -v main.c
76
Compiler Driver
77
…
*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer
are incompatible}} %{!iplugindir*:%{fplugin*:%:find-
plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %
{d*} %{m*} %{aux-info*} %{fcompare-debug-second:
%:compare-debug-auxbase-opt(%b)} %{!fcompare-debug-
second:%{c|S: %{o*:-auxbase-strip %*}%{!o*:-auxbase
%b}}}%{!c:%{!S:-auxbase %b}}…
…
*startfile:
%{!mandroid|tno-android-ld:%{!shared: %{pg|p|profile:gcrt1.o
%s;pie:Scrt1.o%s;:crt1.o%s}} crti.o%s %
{static:crtbeginT.o%s;shared|pie:crtbeginS.o
%s;:crtbegin.o%s};:%{shared: crtbegin_so%O%s;: %{static:
crtbegin_static%O%s;: crtbegin_dynamic%O%s}}}
…
gcc -dumpspecs
78
…
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/
usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/
local/lib64"); SEARCH_DIR("=/lib/x86_64-linux-gnu");
SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib/x86_64-
linux-gnu"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/
usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/
lib");
SECTIONS
{
/* Read-only sections, merged into text segment: */
PROVIDE (__executable_start = SEGMENT_START("text-
segment", 0x400000)); . = SEGMENT_START("text-segment",
0x400000) + SIZEOF_HEADERS;
…
ld -verbose
79
…
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by
elf32.em. */
*(.gnu.warning)
}
…
ld -verbose
80
Сборка
Препроцессинг — сс1, cc1plus
C++ с директивами препроцессора → C++
Компиляция — cc1, cc1plus, as
C++ → ассемблер → машинный код
Один исходный файл → один объектный файл
Компоновка — ld (collect2)
Объектные файлы → исполняемый файл
Сборка — gcc
Всё вместе
81
$ gcc -o program main.cpp sum.cpp
$ ls
main.cpp program sum.cpp
Всё вместе
82
За кадром
83
За кадром
Другие компиляторы
LLVM + Clang (clang)
Microsoft Visual C++ (cl)
Другие ОС
Windows
– Portable Executable (PE)
– Common Object File Format (COFF)
Mac OS X
– Mach Object (Mach-O)
84
За кадром
Link-Time Optimization
GCC
– GIMPLE в отдельной секции
– linker plugin
LLVM + Clang
– LLVM byte-code (AST)
– linker plugin
85
Александр Сомов
somov@yandex-team.ru
Спасибо за внимание!

Weitere ähnliche Inhalte

Was ist angesagt?

C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Fwdays
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Anastasia Lubennikova
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Yandex
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgYuri Zhloba
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
Linux basics. Занятие 3.
Linux basics. Занятие 3. Linux basics. Занятие 3.
Linux basics. Занятие 3. Vikentsi Lapa
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolAlexandre Kalendarev
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?tfmailru
 
Haskell
HaskellHaskell
HaskellDevDay
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование LinuxAnthony Shoumikhin
 

Was ist angesagt? (20)

C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
Python. Обработка ошибок
Python. Обработка ошибокPython. Обработка ошибок
Python. Обработка ошибок
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP" Anton Shabouta "Implementing async binary clients in pure PHP"
Anton Shabouta "Implementing async binary clients in pure PHP"
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Python&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.byPython&Printer / Андрей Пучко / penta.by
Python&Printer / Андрей Пучко / penta.by
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
Отладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbgОтладка в Erlang, trace/dbg
Отладка в Erlang, trace/dbg
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Linux basics. Занятие 3.
Linux basics. Занятие 3. Linux basics. Занятие 3.
Linux basics. Занятие 3.
 
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере Tarantool
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
Haskell
HaskellHaskell
Haskell
 
Программирование Linux
Программирование LinuxПрограммирование Linux
Программирование Linux
 

Andere mochten auch

An Introduction to PC-Lint
An Introduction to PC-LintAn Introduction to PC-Lint
An Introduction to PC-LintRalf Holly
 
The Art of Writing Efficient Software
The Art of Writing Efficient SoftwareThe Art of Writing Efficient Software
The Art of Writing Efficient SoftwareRalf Holly
 
Static Analysis and the FDA Guidance for Medical Device Software
Static Analysis and the FDA Guidance for Medical Device SoftwareStatic Analysis and the FDA Guidance for Medical Device Software
Static Analysis and the FDA Guidance for Medical Device SoftwareErika Barron
 
Static Code Analysis and AutoLint
Static Code Analysis and AutoLintStatic Code Analysis and AutoLint
Static Code Analysis and AutoLintLeander Hasty
 
Static Code Analysis and Cppcheck
Static Code Analysis and CppcheckStatic Code Analysis and Cppcheck
Static Code Analysis and CppcheckZachary Blair
 
Static Code Analysis
Static Code AnalysisStatic Code Analysis
Static Code AnalysisAnnyce Davis
 

Andere mochten auch (6)

An Introduction to PC-Lint
An Introduction to PC-LintAn Introduction to PC-Lint
An Introduction to PC-Lint
 
The Art of Writing Efficient Software
The Art of Writing Efficient SoftwareThe Art of Writing Efficient Software
The Art of Writing Efficient Software
 
Static Analysis and the FDA Guidance for Medical Device Software
Static Analysis and the FDA Guidance for Medical Device SoftwareStatic Analysis and the FDA Guidance for Medical Device Software
Static Analysis and the FDA Guidance for Medical Device Software
 
Static Code Analysis and AutoLint
Static Code Analysis and AutoLintStatic Code Analysis and AutoLint
Static Code Analysis and AutoLint
 
Static Code Analysis and Cppcheck
Static Code Analysis and CppcheckStatic Code Analysis and Cppcheck
Static Code Analysis and Cppcheck
 
Static Code Analysis
Static Code AnalysisStatic Code Analysis
Static Code Analysis
 

Ähnlich wie Александр Сомов "C++: препроцессор, компилятор, компоновщик"

Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
ОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CVladimir Parfinenko
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
трасировка Mpi приложений
трасировка Mpi приложенийтрасировка Mpi приложений
трасировка Mpi приложенийMichael Karpov
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Ontico
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеit-people
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Виктор Ашик - Python, part 1
Виктор Ашик - Python, part 1Виктор Ашик - Python, part 1
Виктор Ашик - Python, part 1Yandex
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Антон Наумович - Контроль качества и сопровождение в реальном времени
Антон Наумович - Контроль качества и сопровождение в реальном времениАнтон Наумович - Контроль качества и сопровождение в реальном времени
Антон Наумович - Контроль качества и сопровождение в реальном времениCOMAQA.BY
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программированияmcroitor
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...Positive Hack Days
 
повторение
повторениеповторение
повторениеTanya
 
повторение
повторениеповторение
повторениеTanya
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 

Ähnlich wie Александр Сомов "C++: препроцессор, компилятор, компоновщик" (20)

Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
ОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык CОПК № 2 – Алгоритмы и структуры данных, язык C
ОПК № 2 – Алгоритмы и структуры данных, язык C
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
лекция 1
лекция 1лекция 1
лекция 1
 
трасировка Mpi приложений
трасировка Mpi приложенийтрасировка Mpi приложений
трасировка Mpi приложений
 
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
Address Sanitizer или как сделать программы на c/с++ надежнее и безопаснее (К...
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Виктор Ашик - Python, part 1
Виктор Ашик - Python, part 1Виктор Ашик - Python, part 1
Виктор Ашик - Python, part 1
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Антон Наумович - Контроль качества и сопровождение в реальном времени
Антон Наумович - Контроль качества и сопровождение в реальном времениАнтон Наумович - Контроль качества и сопровождение в реальном времени
Антон Наумович - Контроль качества и сопровождение в реальном времени
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программирования
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
Positive Hack Days. Олексюк. Автоматический поиск уязвимостей в программах бе...
 
повторение
повторениеповторение
повторение
 
повторение
повторениеповторение
повторение
 
C++ теория
C++ теорияC++ теория
C++ теория
 

Mehr von Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

Mehr von Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Александр Сомов "C++: препроцессор, компилятор, компоновщик"

  • 1.
  • 3. Содержание Сборка программы Как устроен процесс сборки Какие файлы создаются, как они устроены, что содержат Особенности сборки C и C++ Использующиеся программы Препроцессор и его отладка Детали языка (inline, static и так далее) Стандартная библиотека 3
  • 5. int sum(int a, int b); int main() { int result = sum(1, 2); return result * 2; } main.c 5 int sum(int a, int b) { return a + b; } sum.c
  • 6. $ gcc -o program main.c sum.c $ ./program; echo $? 6 Собираем 6
  • 7. $ gcc -c main.c $ gcc -c sum.c $ ls main.c main.o sum.c sum.o $ gcc -o program main.o sum.o $ ./program; echo $? 6 Собираем 7
  • 8. Объектные файлы Содержимое Машинный код Секции дополнительных данных – От чего зависит и какие зависимости предоставляет – Как загружать – Как запускать Использование Промежуточные объектные файлы – Код отдельных частей программы Исполняемый файл 8
  • 10. $ gcc -c main.c $ gcc -c sum.c $ ls main.c main.o sum.c sum.o $ gcc -o program main.o sum.o $ ./program; echo $? 6 Собираем 10
  • 11. Процесс Компиляция (compile) C++ → машинный код Один исходный файл → один объектный файл Компоновка (link) Объектные файлы → исполняемый файл Сборка (build) Всё вместе 11
  • 13. sum.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <sum>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 89 7d fc ! mov %edi,-0x4(%rbp) 7:! 89 75 f8 ! mov %esi,-0x8(%rbp) a:! 8b 45 f8 ! mov -0x8(%rbp),%eax d:! 8b 55 fc ! mov -0x4(%rbp),%edx 10:! 01 d0 ! add %edx,%eax 12:! 5d ! pop %rbp 13:! c3 ! retq objdump -d -r sum.o 13
  • 14. main.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 48 83 ec 10 ! sub $0x10,%rsp 8:! be 02 00 00 00 ! mov $0x2,%esi d:! bf 01 00 00 00 ! mov $0x1,%edi 12:! e8 00 00 00 00 ! callq 17 <main+0x17> ! ! ! 13: R_X86_64_PC32! sum-0x4 17:! 89 45 fc ! mov %eax,-0x4(%rbp) 1a:! 8b 45 fc ! mov -0x4(%rbp),%eax 1d:! 01 c0 ! add %eax,%eax 1f:! c9 ! leaveq objdump -d -r main.o 14
  • 15. Symbol table '.symtab' contains 10 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS main.c 2: 00000000 0 SECTION LOCAL DEFAULT 1 3: 00000000 0 SECTION LOCAL DEFAULT 3 4: 00000000 0 SECTION LOCAL DEFAULT 4 5: 00000000 0 SECTION LOCAL DEFAULT 6 6: 00000000 0 SECTION LOCAL DEFAULT 7 7: 00000000 0 SECTION LOCAL DEFAULT 5 8: 00000000 33 FUNC GLOBAL DEFAULT 1 main 9: 00000000 0 NOTYPE GLOBAL DEFAULT UND sum readelf -s main.o 15
  • 16. Символы Имя — произвольная строка Значение — 64-битное число (адрес, смещение и т. д.) Свойства Тип Видимость – локальный символ – глобальный символ – внешний символ 16
  • 17. Symbol table '.symtab' contains 10 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS main.c 2: 00000000 0 SECTION LOCAL DEFAULT 1 3: 00000000 0 SECTION LOCAL DEFAULT 3 4: 00000000 0 SECTION LOCAL DEFAULT 4 5: 00000000 0 SECTION LOCAL DEFAULT 6 6: 00000000 0 SECTION LOCAL DEFAULT 7 7: 00000000 0 SECTION LOCAL DEFAULT 5 8: 00000000 33 FUNC GLOBAL DEFAULT 1 main 9: 00000000 0 NOTYPE GLOBAL DEFAULT UND sum readelf -s main.o 17
  • 19. main.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 48 83 ec 10 ! sub $0x10,%rsp 8:! be 02 00 00 00 ! mov $0x2,%esi d:! bf 01 00 00 00 ! mov $0x1,%edi 12:! e8 00 00 00 00 ! callq 17 <main+0x17> ! ! ! 13: R_X86_64_PC32! sum-0x4 17:! 89 45 fc ! mov %eax,-0x4(%rbp) 1a:! 8b 45 fc ! mov -0x4(%rbp),%eax 1d:! 01 c0 ! add %eax,%eax 1f:! c9 ! leaveq objdump -d -r main.o 19
  • 20. Секции Именованный блок данных в объектном файле .text — код программы .data — статически инициализированные данные .symtab — таблица символов Тип секции Код Статические данные Таблицы символов Таблицы строк 20
  • 21. … [ 1] .text PROGBITS PROGBITS 00000000 00000040 0 00000021 00000000 0 1 [00000006]: ALLOC, EXEC … [ 3] .data PROGBITS PROGBITS 00000000 00000061 0 00000000 00000000 0 1 [00000003]: WRITE, ALLOC … [10] .symtab SYMTAB SYMTAB 00000000 00000420 11 000000f0 00000018 8 8 [00000000]: … readelf -t main.o 21
  • 22. Компоновщик Оперирует секциями Слить несколько секций в одну Оставить один экземпляр Определяет базовые адреса секций Релоцирует код, используя символы Формирует исполняемый файл 22
  • 24. 000000000040050e <sum>: 40050e:!55 ! push %rbp 40050f:!48 89 e5 ! mov %rsp,%rbp 400512:!89 7d fc ! mov %edi,-0x4(%rbp) 400515:!89 75 f8 ! mov %esi,-0x8(%rbp) 400518:!8b 45 f8 ! mov -0x8(%rbp),%eax 40051b:!8b 55 fc ! mov -0x4(%rbp),%edx 40051e:!01 d0 ! add %edx,%eax 400520:!5d ! pop %rbp 400521:!c3 ! retq objdump -d -r program 24
  • 25. 00000000004004ed <main>: 4004ed:!55 ! push %rbp 4004ee:!48 89 e5 ! mov %rsp,%rbp 4004f1:!48 83 ec 10 ! sub $0x10,%rsp 4004f5:!be 02 00 00 00 ! mov $0x2,%esi 4004fa:!bf 01 00 00 00 ! mov $0x1,%edi 4004ff:!e8 0a 00 00 00 ! callq 40050e <sum> 400504:!89 45 fc ! mov %eax,-0x4(%rbp) 400507:!8b 45 fc ! mov -0x4(%rbp),%eax 40050a:!01 c0 ! add %eax,%eax 40050c:!c9 ! leaveq 40050d:!c3 ! retq objdump -d -r program 25
  • 26. ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: REL (Relocatable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x0 Start of program headers: 0 (bytes into file) Start of section headers: 288 (bytes into file) Flags: 0x0 readelf -h main.o 26
  • 27. ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x400400 Start of program headers: 64 (bytes into file) Start of section headers: 4456 (bytes into file) Flags: 0x0 readelf -h program 27
  • 29. main.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 48 83 ec 10 ! sub $0x10,%rsp 8:! be 02 00 00 00 ! mov $0x2,%esi d:! bf 01 00 00 00 ! mov $0x1,%edi 12:! e8 00 00 00 00 ! callq 17 <main+0x17> ! ! ! 13: R_X86_64_PC32! sum-0x4 17:! 89 45 fc ! mov %eax,-0x4(%rbp) 1a:! 8b 45 fc ! mov -0x4(%rbp),%eax 1d:! 01 c0 ! add %eax,%eax 1f:! c9 ! leaveq objdump -d -r main.o 29
  • 30. System V AMD64 ABI Первые 6 целочисленных аргументов и указателей rdi, rsi, rdx, rcx, r8, r9 Типы с плавающей точкой xmm0-xmm7 Остальное на стеке Возвращаемое значение rax 30
  • 32. int sum(int a, int b); int main() { int result = sum(1, 2); return result * 2; } main.c 32 int sum(int a, int b) { return a + b; } sum.c
  • 33. #include "sum.h" int main() { int result = sum(1, 2); return result * 2; } main.c 33 int sum(int a, int b); sum.h
  • 34. # 1 "main.c" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "main.c" # 1 "sum.h" 1 int sum(int a, int b); # 2 "main.c" 2 int main() { int result = sum(1, 2); return result * 2; } gcc -E main.c 34
  • 35. Препроцессор Обрабатывает текст #include — подстановка содержимого другого файла – расширение не важно — хоть *.txt, хоть *.exe – *.h — удобное соглашение #ifdef/#endif — выборочное включение/исключение текста 35
  • 37. Сборка Препроцессинг (preprocess) C/C++ с директивами препроцессора → C/C++ Исходный файл + заголовочные файлы → один исходный файл Компиляция (compile) C/C++ → машинный код Один исходный файл → один объектный файл Компоновка (link) Объектные файлы → исполняемый файл 37
  • 39. … /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu main.c -quiet -dumpbase main.c - mtune=generic -march=x86-64 -auxbase main -version - fstack-protector -Wformat -Wformat-security -o /tmp/ ccsJ9O2h.s … as -v --64 -o /tmp/ccPe5usI.o /tmp/ccsJ9O2h.s … /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu sum.c -quiet -dumpbase sum.c - mtune=generic -march=x86-64 -auxbase sum -version - fstack-protector -Wformat -Wformat-security -o /tmp/ ccsJ9O2h.s … as -v --64 -o /tmp/ccSAbeU8.o /tmp/ccsJ9O2h.s … gcc -o program -v main.c 39
  • 40. /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ -- build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -- as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o program /usr/lib/gcc/x86_64-linux-gnu/ 4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64- linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/ gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/ x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/ 4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64- linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/ lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. /tmp/ ccPe5usI.o /tmp/ccSAbeU8.o -lgcc --as-needed -lgcc_s -- no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as- needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/ lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/ crtn.o gcc -o program -v main.c 40
  • 41. Сборка Препроцессинг — сс1 С/C++ с директивами препроцессора → C++ Компиляция — cc1, as С/C++ → ассемблер → машинный код Один исходный файл → один объектный файл Компоновка — ld (collect2) Объектные файлы → исполняемый файл 41
  • 43. #include "sum.h" int main() { int result = sum(1, 2); return result * 2; } main.c 43 #include <sum.h> int main() { int result = sum(1, 2); return result * 2; } main.c
  • 44. "sum.h" vs <sum.h> Разные списки директорий, в которых препроцессор ищет файл Если файл "sum.h" не найден, он ищется как <sum.h> Соглашение "sum.h" — локальный файл – Сначала ищется в текущей директории <sum.h> — системный файл 44
  • 45. … ignoring nonexistent directory "/usr/local/include/x86_64- linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux- gnu/4.8/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/4.8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. … gcc -o program -v main.c 45
  • 46. Опции препроцессора Директории -Idir — добавить dir в начало обоих списков -iquotedir — добавить dir в начало списка для #include "file" Отладка -H — вывести дерево #include -dM — вывести #define для всех предопределённых переменных -dD — оставить директивы #define в обработанном файле -dI — оставить директивы #include в обработанном файле -P — не генерировать номера строк 46
  • 47. #include <stdio.h> int main() { puts("Hello, world!"); return 0; } main.c 47
  • 48. . /usr/include/stdio.h .. /usr/include/features.h ... /usr/include/x86_64-linux-gnu/sys/cdefs.h .... /usr/include/x86_64-linux-gnu/bits/wordsize.h ... /usr/include/x86_64-linux-gnu/gnu/stubs.h .... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h .. /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h .. /usr/include/x86_64-linux-gnu/bits/types.h ... /usr/include/x86_64-linux-gnu/bits/wordsize.h ... /usr/include/x86_64-linux-gnu/bits/typesizes.h .. /usr/include/libio.h ... /usr/include/_G_config.h .... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h .... /usr/include/wchar.h ... /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h .. /usr/include/x86_64-linux-gnu/bits/stdio_lim.h … gcc -E -H main.c > main.i 48
  • 49. $ wc main.i 841 2073 17138 main.i 49
  • 51. Ошибки сборки Ошибки multiple definition of `sum' undefined reference to `sum' too many arguments to function ‘sum’ Поиск причины gcc -v — что компилируется и компонуется gcc -E — результат препроцессинга, какие сигнатуры используются readelf -s — какие символы в объектном файле, какие символы — внешние objdump -d -r — где используются внешние символы 51
  • 53. int sum(int a, int b); int main() { int result = sum(1, 2); return result * 2; } main.cpp 53 int sum(int a, int b) { return a + b; } sum.cpp
  • 54. sum.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <_Z3sumii>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 89 7d fc ! mov %edi,-0x4(%rbp) 7:! 89 75 f8 ! mov %esi,-0x8(%rbp) a:! 8b 45 f8 ! mov -0x8(%rbp),%eax d:! 8b 55 fc ! mov -0x4(%rbp),%edx 10:! 01 d0 ! add %edx,%eax 12:! 5d ! pop %rbp 13:! c3 ! retq objdump -d -r sum.o 54
  • 55. $ echo _Z3sumii | c++filt sum(int, int) Декорирование (mangling) 55
  • 56. sum.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <sum(int, int)>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 89 7d fc ! mov %edi,-0x4(%rbp) 7:! 89 75 f8 ! mov %esi,-0x8(%rbp) a:! 8b 45 f8 ! mov -0x8(%rbp),%eax d:! 8b 55 fc ! mov -0x4(%rbp),%edx 10:! 01 d0 ! add %edx,%eax 12:! 5d ! pop %rbp 13:! c3 ! retq objdump -d -r -C sum.o 56
  • 57. … /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1plus -quiet -v - imultiarch x86_64-linux-gnu -D_GNU_SOURCE sum.cpp -quiet -dumpbase sum.cpp -mtune=generic -march=x86-64 -auxbase sum -version -fstack-protector -Wformat -Wformat-security -o /tmp/cco5ypSz.s … gcc -v main.cpp sum.cpp 57
  • 59. inline int sum(int a, int b) { return a + b; } int main() { int result = sum(1, 2); return result * 2; } main.cpp 59 inline int sum(int a, int b) { return a + b; } int calc() { return sum(2, 3); } sum.cpp
  • 60. Disassembly of section .text: 0000000000000000 <_Z4calcv>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! be 03 00 00 00 ! mov $0x3,%esi 9:! bf 02 00 00 00 ! mov $0x2,%edi e:! e8 00 00 00 00 ! callq 13 <_Z4calcv+0x13> ! ! ! f: R_X86_64_PC32! _Z3sumii-0x4 13:! 5d ! pop %rbp 14:! c3 ! retq objdump -d -r sum.o 60
  • 61. Disassembly of section .text._Z3sumii: 0000000000000000 <_Z3sumii>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 89 7d fc ! mov %edi,-0x4(%rbp) 7:! 89 75 f8 ! mov %esi,-0x8(%rbp) a:! 8b 45 f8 ! mov -0x8(%rbp),%eax d:! 8b 55 fc ! mov -0x4(%rbp),%edx 10:! 01 d0 ! add %edx,%eax 12:! 5d ! pop %rbp 13:! c3 ! retq objdump -d -r sum.o 61
  • 62. … [ 6] .text._Z3sumii PROGBITS PROGBITS 00000000 0000005d 0 00000014 00000000 0 1 [00000206]: ALLOC, EXEC, GROUP … readelf -t sum.o 62
  • 64. static int sum(int a, int b) { return a + b; } sum.c 64
  • 65. Symbol table '.symtab' contains 9 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS sum.c 2: 00000000 0 SECTION LOCAL DEFAULT 1 3: 00000000 0 SECTION LOCAL DEFAULT 2 4: 00000000 0 SECTION LOCAL DEFAULT 3 5: 00000000 20 FUNC LOCAL DEFAULT 1 sum 6: 00000000 0 SECTION LOCAL DEFAULT 5 7: 00000000 0 SECTION LOCAL DEFAULT 6 8: 00000000 0 SECTION LOCAL DEFAULT 4 readelf -s sum.o 65
  • 66. main.o: In function `main': main.c:(.text+0x13): undefined reference to `sum' collect2: error: ld returned 1 exit status gcc -o program sum.o main.o 66
  • 68. extern "C" { int sum(int a, int b) { return a + b; } } extern.cpp 68
  • 69. Disassembly of section .text: 0000000000000000 <sum>: 0:! 55 ! push %rbp 1:! 48 89 e5 ! mov %rsp,%rbp 4:! 89 7d fc ! mov %edi,-0x4(%rbp) 7:! 89 75 f8 ! mov %esi,-0x8(%rbp) a:! 8b 45 f8 ! mov -0x8(%rbp),%eax d:! 8b 55 fc ! mov -0x4(%rbp),%edx 10:! 01 d0 ! add %edx,%eax 12:! 5d ! pop %rbp 13:! c3 ! retq objdump -d -r extern.o 69
  • 71. int sum(int a, int b); int main() { int result = sum(1, 2); return result * 2; } main.c 71 int sum(int a, int b) { return a + b; } sum.c
  • 72. 00000000004004ed <main>: 4004ed:!55 ! push %rbp 4004ee:!48 89 e5 ! mov %rsp,%rbp 4004f1:!48 83 ec 10 ! sub $0x10,%rsp 4004f5:!be 02 00 00 00 ! mov $0x2,%esi 4004fa:!bf 01 00 00 00 ! mov $0x1,%edi 4004ff:!e8 0a 00 00 00 ! callq 40050e <sum> 400504:!89 45 fc ! mov %eax,-0x4(%rbp) 400507:!8b 45 fc ! mov -0x4(%rbp),%eax 40050a:!01 c0 ! add %eax,%eax 40050c:!c9 ! leaveq 40050d:!c3 ! retq objdump -d -r program 72
  • 73. ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x400400 Start of program headers: 64 (bytes into file) Start of section headers: 4456 (bytes into file) Flags: 0x0 readelf -h program 73
  • 74. Disassembly of section .text: 0000000000400400 <_start>: 400400: 31 ed xor %ebp,%ebp 400402: 49 89 d1 mov %rdx,%r9 … 40041d: 48 c7 c7 ed 04 40 00 mov $0x4004ed,%rdi 400424: e8 b7 ff ff ff callq 4003e0 <__libc_start_main@plt> 400429: f4 hlt objdump -d -r program 74
  • 75. __libc_start_main(…) { argc = … argv = … some_libc_init(); exit(main(argc, argv)); } __libc_start_main 75
  • 76. /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ -- build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -- as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o program /usr/lib/gcc/x86_64-linux-gnu/ 4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64- linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/ gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/ x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/ 4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64- linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/ lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. /tmp/ ccPe5usI.o /tmp/ccSAbeU8.o -lgcc --as-needed -lgcc_s -- no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as- needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/ lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/ crtn.o gcc -o program -v main.c 76
  • 78. … *cc1_options: %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find- plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} % {d*} %{m*} %{aux-info*} %{fcompare-debug-second: %:compare-debug-auxbase-opt(%b)} %{!fcompare-debug- second:%{c|S: %{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}}… … *startfile: %{!mandroid|tno-android-ld:%{!shared: %{pg|p|profile:gcrt1.o %s;pie:Scrt1.o%s;:crt1.o%s}} crti.o%s % {static:crtbeginT.o%s;shared|pie:crtbeginS.o %s;:crtbegin.o%s};:%{shared: crtbegin_so%O%s;: %{static: crtbegin_static%O%s;: crtbegin_dynamic%O%s}}} … gcc -dumpspecs 78
  • 79. … OUTPUT_ARCH(i386:x86-64) ENTRY(_start) SEARCH_DIR("/usr/x86_64-linux-gnu/lib64"); SEARCH_DIR("=/ usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/ local/lib64"); SEARCH_DIR("=/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib/x86_64- linux-gnu"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/ usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/ lib"); SECTIONS { /* Read-only sections, merged into text segment: */ PROVIDE (__executable_start = SEGMENT_START("text- segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS; … ld -verbose 79
  • 80. … .text : { *(.text.unlikely .text.*_unlikely .text.unlikely.*) *(.text.exit .text.exit.*) *(.text.startup .text.startup.*) *(.text.hot .text.hot.*) *(.text .stub .text.* .gnu.linkonce.t.*) /* .gnu.warning sections are handled specially by elf32.em. */ *(.gnu.warning) } … ld -verbose 80
  • 81. Сборка Препроцессинг — сс1, cc1plus C++ с директивами препроцессора → C++ Компиляция — cc1, cc1plus, as C++ → ассемблер → машинный код Один исходный файл → один объектный файл Компоновка — ld (collect2) Объектные файлы → исполняемый файл Сборка — gcc Всё вместе 81
  • 82. $ gcc -o program main.cpp sum.cpp $ ls main.cpp program sum.cpp Всё вместе 82
  • 84. За кадром Другие компиляторы LLVM + Clang (clang) Microsoft Visual C++ (cl) Другие ОС Windows – Portable Executable (PE) – Common Object File Format (COFF) Mac OS X – Mach Object (Mach-O) 84
  • 85. За кадром Link-Time Optimization GCC – GIMPLE в отдельной секции – linker plugin LLVM + Clang – LLVM byte-code (AST) – linker plugin 85