рдирдорд╕реНрдХрд╛рд░ рдореБрдХреНрдд-рдореБрдХреНрдд рджреБрдирд┐рдпрд╛ рдХреЗ рд▓реЗрдЦ
рд╣реИрд▓реЛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдРрд╕рд╛ рд▓рдХреНрд╖реНрдпрд╣реАрди рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдПрдВ рдЬреЛ рдХреБрдЫ рд╕рд░рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ "рдИрдПрд▓рдПрдл, рд╣реИрд▓реЛ!"ред рд╕рдордЭреЗрдВ рдХрд┐ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреИрд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реИрд╕реЗ, 100 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рднреАрддрд░ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╕реА ++ рдореЗрдВ рдорд╛рдирдХ рд╣реЗрд▓реЛрд╡рд░реНрд▓реНрдб
#include <iostream> using namespace std; int main() { cout << "ELF, hello!\n"; return 0; }
рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдЖрдХрд╛рд░ рджреЗрдЦреЗрдВ:
$ g++ test.cpp -static && ls -s -h a.out 1,3M a.out
рдХрд┐рддрдирд╛, рдХрд┐рддрдирд╛? 1.3 рдПрдордмреА? 12 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рд╣рдореНрдо ... рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╕реА рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
#include "stdio.h" int main() { printf("ELF, hello!\n"); return 0; }
рд╣рдо рднреА рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ -static рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ - рдореБрдЭреЗ рдкреВрд░реЗ рдХреЛрдб рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде, рдЖрдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЫреЛрдЯреЗ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╣рдо рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВ рдЙрддрдирд╛ рдирд╣реАрдВред
$ gcc test.c -static && ls -s -h a.out 568K a.out
рдЖрдзрд╛ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХрдоред рдпрд╣рд╛рдБ рдпрд╣ рдПрд╕рдЯреАрдПрд▓ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рднрд╛рд░реА рддреЛрдкрдЦрд╛рдиреЗ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред рд╣рдо asm рдкрд░ helloworld рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ stdlib рдХреЗ рдмрд┐рдирд╛ред рдореИрдВ рдПрдЯреА рдПрдВрдб рдЯреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
.data str: .ascii "ELF, hello!" .byte 10 .text .global _start _start: movl $4, %eax movl $1, %ebx movl $str, %ecx movl $12, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80
рдбреЗрдЯрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рджреЛ рдЦрдВрдб - рд╣рдорд╛рд░рд╛ рд╕рдВрджреЗрд╢ (рдФрд░ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 10), рдХреЛрдб рдЕрдиреБрднрд╛рдЧ (.text) рдореЗрдВ - рд╣рдо рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рд░ 80 рд╡реЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рджреЛ рдмрд╛рд░ (рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде) рдХрд╣рддреЗ рд╣реИрдВред рд╕рд╣реА рд╕рдорд╛рдкрди рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реА рдмрд╛рд░ред
рд╣рдо рдмрдирд╛рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд (рдпрд╛ рдЕрдиреБрд╡рд╛рдж рдФрд░ рд▓рд┐рдВрдХ) рдХрд░рддреЗ рд╣реИрдВ:
$ gcc easy.s -nostdlib && du -sb a.out 752 a.out
752 рдмрд╛рдЗрдЯреНрд╕ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдкрдЯреНрдЯреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВ:
$ strip a.out && du -sb a.out 476 a.out
рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред 476 рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? Objdump рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдХреЗ
$ objdump -D a.out a.out: file format elf32-i386 Disassembly of section .note.gnu.build-id: 08048094 <.note.gnu.build-id>: 8048094: 04 00 add $0x0,%al ... - , ... 80480b6: b6 08 mov $0x8,%dh Disassembly of section .text: 080480b8 <.text>: 80480b8: b8 04 00 00 00 mov $0x4,%eax 80480bd: bb 01 00 00 00 mov $0x1,%ebx 80480c2: b9 dc 90 04 08 mov $0x80490dc,%ecx 80480c7: ba 0c 00 00 00 mov $0xc,%edx 80480cc: cd 80 int $0x80 80480ce: b8 01 00 00 00 mov $0x1,%eax 80480d3: bb 00 00 00 00 mov $0x0,%ebx 80480d8: cd 80 int $0x80 Disassembly of section .data: 080490dc <.data>: 80490dc: 45 inc %ebp 80490dd: 4c dec %esp 80490de: 46 inc %esi 80490df: 2c 20 sub $0x20,%al 80490e1: 68 65 6c 6c 6f push $0x6f6c6c65 80490e6: 21 0a and %ecx,(%edx)
рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдо рддреАрди рдЦрдВрдб рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЗрд╡рд▓ рджреЛ рд╣реА рд▓рд┐рдЦреЗ рдЧрдП рдереЗред .Text рд╕реЗрдХреНрд╢рди рдореЗрдВ рд╣рдорд╛рд░рд╛ рдХреЛрдб рд╣реИред рдбреЗрдЯрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ - 12 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдпреЛрдЧрд┐рдиреА рд╣реИрд▓реЛ (objdump рднреА рдЙрдиреНрд╣реЗрдВ disassembled)ред рдФрд░ рдХреНрдпрд╛ рд╣реИ .note.gnu.build-id рдЕрдиреБрднрд╛рдЧ? рд╣рдордиреЗ рдЗрд╕реЗ рдСрд░реНрдбрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ:
$ strip -R .note.gnu.build-id a.out && du -sb a.out 416 a.out
рдПрдХ рдФрд░ 60 рдмрд╛рдЗрдЯ рдЬреАрддреАред рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рдеред рджреВрд╕рд░реЗ, рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд░рдЬрд┐рд╕реНрдЯрд░ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЙрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдПрдмреАрдЖрдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ)ред
рдирддреАрдЬрддрди, Movl $ 4,% eax рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ 5 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рд╣рдо movb $ 4,% al рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ 2 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рддреАрд╕рд░рд╛, рд╣рдо рдЕрдВрддрд┐рдо рд╡реНрдпрд╡рдзрд╛рди рдХреЗ рдмрд╛рдж рдХреЛрдб рдореЗрдВ рдЕрдкрдиреА рд▓рд╛рдЗрди рдбрд╛рд▓рдХрд░, .data рд╕реЗрдХреНрд╢рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрдВрдЧреЗ (рд╡реИрд╕реЗ рднреА, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдЧреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ):
.text .global _start _start: movb $4, %al movb $1, %bl movl $str, %ecx movb $12, %dl int $0x80 movb $1, %al int $0x80 str: .ascii "ELF, hello!" .byte 10
рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╣рдЯрд╛рдПрдВ, рдЖрдХрд╛рд░ рджреЗрдЦреЗрдВ:
$ gcc -nostdlib easy.s $ strip a.out $ strip -R .note.gnu.build-id a.out $ du -sb a.out 320 a.out
рд▓рдЧрддрд╛ рд╣реИ рд╣рдо рд╣рдж рддрдХ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВред 320 рдмрд╛рдЗрдЯреНрд╕ - рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдпрд╛ рдирд╣реАрдВ? рдпреЗ 320 рдмрд╛рдЗрдЯреНрд╕ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВ? рд╣рдорд╛рд░рд╛ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдо рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдирд░реА рдореЗрдВ рдПрдХ рдИрдПрд▓рдПрдл рд╣реЗрдбрд░ рднреА рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдИрдПрд▓рдПрдл рд╡рд┐рд╡рд░рдг (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдВ ) рдЦреЛрд▓рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╣реЗрдбрд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЗрдХреНрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд▓рд┐рдВрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреБрдЫ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ рдЬреИрд╕рд╛ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕рдЪ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣рдо рдкрд░ рдкрдбрд╝рддреА рд╣реИред
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓рд╛:
.set ofs, 0x10000 .byte 0x7F .ascii "ELF" .long 0, 0, 0 .word 2 .word 3 .long 0 .long _start + ofs .long phdr .long 0 .long 0 .word 0 .word phdrsize .word 1 .word 0 .word 0 .word 0 phdr: .long 1 .long 0 .long ofs .long 0 .long filesize .long filesize .long 5 .long 0 .set phdrsize, . - phdr _start: movb $4, %al movb $1, %bl movl $(str+ofs), %ecx movb $12, %dl int $0x80 movb $1, %al int $0x80 str: .ascii "ELF, hello!" .byte 10 .set filesize, .
рдЕрдм рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рд░рд▓реАрдХреГрдд, рдСрдлрд╝рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдХреЛрдб рдХреЗ рдмреАрдЪ рдХреЗ рдкрддреЗ рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рд░реИрдо рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░реИрдо рдореЗрдВ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИ)ред рдЖрдорддреМрд░ рдкрд░ рд▓рд┐рдВрдХрд░ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЕрдкрдиреЗ рджрдо рдкрд░ рд╣реИрдВред рдореИрдВрдиреЗ рдСрдлрд╝рд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдСрдлрд╕реЗрдЯ рдХреЛ рд░рдЦрд╛ред рдСрдлрд╕реЗрдЯ рдЖрдХрд╛рд░ рдиреЗ рдореЗрд░реА рдХрд╛рд░ (10,000) рдкрд░ рд╕рдмрд╕реЗ рдХрдо рд╕рдВрднрд╡ рд▓рд┐рдпрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ 8048000 рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдИ рд╢рд░реНрдд рдирд╣реАрдВ рд╣реИред
рдИрдПрд▓рдПрдл рд╣реЗрдбрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдИрдПрд▓рдПрдл рд╣реЗрдбрд░ рдирд╣реАрдВ рд╣реИред рдПрдХ рдПрд▓реНрдл рд╣реЗрдбрд░ рдФрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ - рдЙрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрднреА рднреА рдЕрдиреБрднрд╛рдЧ рд╣реЗрдбрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣реЗрдбрд░ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдмрд╛рдХреА рд▓реЛрдЧ рд╢реВрдиреНрдп рд╕реЗ рднрд░реЗ рдереЗред
рд╣рдордиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛, рдЗрд╕ рдмрд╛рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ ld:
$ as w3test.s -o w3test.o $ ld -Ttext 0 --oformat binary -o w3test w3test.o $ du -sb w3test 115 w3test
115 рдмрд╛рдЗрдЯреНрд╕! ~ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 10,000 рдЧреБрдирд╛ рдЫреЛрдЯрд╛ред рд╕рдм рдХреБрдЫ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛ред рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВред рдФрд░ 100 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╕реАрдорд╛ рдирд╣реАрдВ рд╣реИ! рд╣реЗрдбрд░ рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреЛрдб рд╕реНрд╡рдпрдВ рдХрд┐рд╕реА рднреА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рдлрд┐рдЯ рд╣реЛрдЧреАред
рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдИрдПрд▓рдПрдл рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдЕрдкреНрд░рдпреБрдХреНрдд рдлрд╝реАрд▓реНрдб рд╣реИрдВ рдкреНрд░рдХрд╛рд░ рд▓рдВрдмреА (рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рддреНрдпреЗрдХ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рдПрдХ рд▓рд╛рдЗрди рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреВрд░реА рд░реЗрдЦрд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рднрд╛рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд╕реАрдо рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ "рдИрдПрд▓рдПрдл" рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдкреАрдПрдЪрдбреА рд╣реЗрдбрд░ рдХреЛ рдПрд▓реНрдл рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рд░рдЦрдХрд░ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрд▓рдПрд▓рдПрдл рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рджред рдпрд╣реА рд╣реИ, рдкреАрдПрдЪ рд╣реЗрдбрд░ рдХреЛ рдПрд▓реНрдл рдкрд░ рдереЛрдбрд╝рд╛ рд╕реНрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рдлрд╝реАрд▓реНрдб рд▓реЗрдпрд░реНрдб рд╣реИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрд▓реНрдл рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрд╕реА рддрд░рд╣, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо "рд▓реЗрдпрд░рд┐рдВрдЧ" рдХреЛ phd рд╣реЗрдбрд░ (рдЙрд╕реА рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП) рдкрд░ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИ:
.set ofs, 0x10000 .byte 0x7F str: .ascii "ELF" .ascii ", hello!" .byte 10, 0, 0, 0 .word 2 .word 3 .long 0 .long _start+ofs .long phdr .long 0 .long 0 .word 0 .word phdrsize phdr: .long 1 .long 0 .long ofs .long 0 .long filesize .long filesize .long 5 .set phdrsize, . - phdr + 4 _start: movb $4, %al movb $1, %bl movl $(str+ofs), %ecx movb $12, %dl int $0x80 movb $1, %al int $0x80 .set filesize, .
рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЖрдХрд╛рд░ рдореЗрдВ 89 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдк рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рднреА рдерд╛ - рдПрд▓реНрдл рд╣реЗрдбрд░ рдХреЗ рдЕрдВрджрд░ рдкреАрдПрдЪ рд╣реЗрдбрд░ рдХреЛ рдкреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ 10,000 рдХреЗ рдиреНрдпреВрдирддрдо рд╡рд┐рд╕реНрдерд╛рдкрди рдиреЗ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рддрд╛рдХрд┐ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЧ рд╣реЛред
PS рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, 61 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдпреЛрдЧрд┐рдиреА рдкрд░ phd рдХреЛ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред -F рдмрд┐рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде nasm / yasm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХрд▓рд┐рддред
BITS 32; ORG 05430000h; DB 0x7F, "ELF"; DD 01h, 00h, $$; DW 02h, 03h; DD @main; DW @main - $$; @main: INC EBX; DB 05h; <-- ADD EAX, DD 04h; <-- LONG(04h) MOV ECX, @text; MOV DL, 12; INT 80h; AND EAX, 00010020h; XCHG EAX, EBX; INT 80h; @text: DB "ELF, hello!", 0Ah;
рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕реНрд░реЛрдд
wikibooks.org - рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЕрд╕реЗрдВрдмрд▓рд░
stackoverflow.com - 20 рд╕реЗ рдХрдо рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб"
muppetlabs.com - рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЯреЗрдиреЗрд╕реА рдИрдПрд▓рдПрдл рдПрдХреНрд╕реЗрд▓реНрдпреВрдмрд▓реНрд╕