
рд╕реА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреНрдпрд╛ рджреЗрдЦрддрд╛ рд╣реИ? рд╡рд╣ fopen
, printf
, scanf
рдФрд░ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред рд╡рд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ open
рдФрд░ mmap
рджреЗрдЦрддрд╛ рд╣реИ - рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХреНрдпреЛрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВ? рд▓реЗрдХрд┐рди, рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдпреЗ рджреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВ ( рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ , рд▓рдЧрднрдЧ рдХрднреА рднреА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП libc
рдореЗрдВ рд░реИрдкрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рджрд▓реАрд▓реЗрдВ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА, рдЬреИрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВред open
, рдкреБрд░рд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛)ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ GNU / Linux рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣рдЬрд╛рд░реЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд░реНрдиреЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИ - рдХрдИ рд╕реМ рдХреЗ рдХреНрд░рдо рдореЗрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреБрдо рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪрдирд╛), рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП - рдСрдкрд░реЗрд╢рди рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЛрдбред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп рдмрддрд╛рдКрдВрдЧрд╛ред рдЗрд╕рдореЗрдВ futex
s рдФрд░ рдЕрдиреНрдп рдЙрдмрд╛рдК (рд╢рд╛рдпрдж) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА "рдФрд░ рдХреНрдпрд╛, рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?"ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреИрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рда рдкрд░ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ: рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ vDSO рдирд╛рдордХ рдПрдХ рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рдРрд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрдп рд╣реИрдВ (рдЪрд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХрд░реНрдиреЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) - рдпреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ time
рдФрд░ gettimeofday
, рдЬреЛ, рдПрдХ рддрд░рдл, рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рддрд░рдл, рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рд╕рдВрджрд░реНрднред
рджреВрд╕рд░реЗ, SIGSEGV рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрд░реИрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ userfaultfd
рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдЬрдм рдпрд╣ userfaultfd
рдкрд░ userfaultfd
ред
рдЕрд╕реНрд╡реАрдХрд░рдг: рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдирдХреНрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдмрд╛рдВрдз рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдпрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛, рдореИрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рд╡рд╛рдкрд╕реА рдХреИрд╕реЗ рдХрд░реЗрдВред
рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ strace
рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛! рдЪреВрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рд╕реЗрдЯ рд╕реАрдорд┐рдд рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ strace
"рджреГрд╖реНрдЯрд┐ рд╕реЗ" рдЬрд╛рдирддрд╛ рд╣реИ, рдпрд╣ рди рдХреЗрд╡рд▓ "рд╕реВрдЪрдХ 0x12345678 рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ" рджрд┐рдЦрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЗрд╕ рдпрд╛ рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдХреНрдпрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ред рдпрджрд┐ strace
рдкрд░реНрдпрд╛рдкреНрдд рддрд╛рдЬрд╝рд╛ рд╣реИ, рддреЛ -k
рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ $ strace -k sleep 1 execve("/bin/sleep", ["sleep", "1"], 0x7ffe9f9cce30 /* 60 vars */) = 0 > /lib/x86_64-linux-gnu/libc-2.30.so(execve+0xb) [0xe601b] > /usr/bin/strace(+0x0) [0xa279c] > /usr/bin/strace(+0x0) [0xa41d2] > /usr/bin/strace(+0x0) [0x7090b] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /usr/bin/strace(+0x0) [0x7112a] brk(NULL) = 0x558936ded000 > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x20b) [0x1ccdb] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1cd2) [0x1b872] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] arch_prctl(0x3001 /* ARCH_??? */, 0x7fff593c0070) = -1 EINVAL ( ) > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e25) [0x1b9c5] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] access("/etc/ld.so.preload", R_OK) = -1 ENOENT ( ) > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x10cb) [0x1db9b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x3c12] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e7b) [0x1ba1b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x1238) [0x1dd08] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_debug_state+0x73a) [0x11d4a] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_exception_free+0x908) [0x189c8] > /lib/x86_64-linux-gnu/ld-2.30.so() [0xa362] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x41b5) [0xeb35] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_exception+0x65) [0x1ca85] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x4603) [0xef83] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x3c55] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e7b) [0x1ba1b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] fstat(3, {st_mode=S_IFREG|0644, st_size=254851, ...}) = 0 > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x1009) [0x1dad9] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_debug_state+0x761) [0x11d71] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_exception_free+0x908) [0x189c8] > /lib/x86_64-linux-gnu/ld-2.30.so() [0xa362] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x41b5) [0xeb35] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_exception+0x65) [0x1ca85] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x4603) [0xef83] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x3c55] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e7b) [0x1ba1b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] mmap(NULL, 254851, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc49621c000 > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x1426) [0x1def6] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_debug_state+0x79d) [0x11dad] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_exception_free+0x908) [0x189c8] > /lib/x86_64-linux-gnu/ld-2.30.so() [0xa362] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x41b5) [0xeb35] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_exception+0x65) [0x1ca85] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x4603) [0xef83] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x3c55] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e7b) [0x1ba1b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] close(3) = 0 > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x10fb) [0x1dbcb] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_debug_state+0x780) [0x11d90] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_exception_free+0x908) [0x189c8] > /lib/x86_64-linux-gnu/ld-2.30.so() [0xa362] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x41b5) [0xeb35] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_exception+0x65) [0x1ca85] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x4603) [0xef83] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x3c55] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e7b) [0x1ba1b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x1238) [0x1dd08] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x7d40] > /lib/x86_64-linux-gnu/ld-2.30.so() [0xa3a8] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x41b5) [0xeb35] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_exception+0x65) [0x1ca85] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x4603) [0xef83] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x3c55] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e7b) [0x1ba1b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360r\2\0\0\0\0\0"..., 832) = 832 > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_error+0x12f8) [0x1ddc8] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x7d79] > /lib/x86_64-linux-gnu/ld-2.30.so() [0xa3a8] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x41b5) [0xeb35] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_catch_exception+0x65) [0x1ca85] > /lib/x86_64-linux-gnu/ld-2.30.so(_dl_rtld_di_serinfo+0x4603) [0xef83] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x3c55] > /lib/x86_64-linux-gnu/ld-2.30.so(__get_cpu_features+0x1e7b) [0x1ba1b] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x203c] > /lib/x86_64-linux-gnu/ld-2.30.so() [0x1108] ... ... brk(NULL) = 0x558936ded000 > /lib/x86_64-linux-gnu/libc-2.30.so(brk+0xb) [0x11755b] > /lib/x86_64-linux-gnu/libc-2.30.so(__sbrk+0x67) [0x117617] > /lib/x86_64-linux-gnu/libc-2.30.so(__default_morecore+0xd) [0x9fd3d] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x2725) [0x9a745] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x3943) [0x9b963] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x3b2b) [0x9bb4b] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x4d9e) [0x9cdbe] > /lib/x86_64-linux-gnu/libc-2.30.so(textdomain+0x740) [0x3be70] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x1d35) [0x35515] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0xbdf) [0x343bf] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x215) [0x339f5] > /bin/sleep() [0x25f0] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /bin/sleep() [0x287e] brk(0x558936e0e000) = 0x558936e0e000 > /lib/x86_64-linux-gnu/libc-2.30.so(brk+0xb) [0x11755b] > /lib/x86_64-linux-gnu/libc-2.30.so(__sbrk+0x91) [0x117641] > /lib/x86_64-linux-gnu/libc-2.30.so(__default_morecore+0xd) [0x9fd3d] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x2725) [0x9a745] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x3943) [0x9b963] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x3b2b) [0x9bb4b] > /lib/x86_64-linux-gnu/libc-2.30.so(thrd_yield+0x4d9e) [0x9cdbe] > /lib/x86_64-linux-gnu/libc-2.30.so(textdomain+0x740) [0x3be70] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x1d35) [0x35515] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0xbdf) [0x343bf] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x215) [0x339f5] > /bin/sleep() [0x25f0] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /bin/sleep() [0x287e] openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 > /lib/x86_64-linux-gnu/libc-2.30.so(__open64_nocancel+0x4c) [0x11679c] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x1ce9) [0x354c9] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0xbdf) [0x343bf] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x215) [0x339f5] > /bin/sleep() [0x25f0] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /bin/sleep() [0x287e] fstat(3, {st_mode=S_IFREG|0644, st_size=8994080, ...}) = 0 > /lib/x86_64-linux-gnu/libc-2.30.so(__fxstat64+0x19) [0x1107b9] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x1e33) [0x35613] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0xbdf) [0x343bf] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x215) [0x339f5] > /bin/sleep() [0x25f0] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /bin/sleep() [0x287e] mmap(NULL, 8994080, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc495795000 > /lib/x86_64-linux-gnu/libc-2.30.so(mmap64+0x26) [0x11baf6] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x1e5d) [0x3563d] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0xbdf) [0x343bf] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x215) [0x339f5] > /bin/sleep() [0x25f0] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /bin/sleep() [0x287e] close(3) = 0 > /lib/x86_64-linux-gnu/libc-2.30.so(__close_nocancel+0xb) [0x1165bb] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x1eab) [0x3568b] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0xbdf) [0x343bf] > /lib/x86_64-linux-gnu/libc-2.30.so(setlocale+0x215) [0x339f5] > /bin/sleep() [0x25f0] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /bin/sleep() [0x287e] nanosleep({tv_sec=1, tv_nsec=0}, NULL) = 0 > /lib/x86_64-linux-gnu/libc-2.30.so(nanosleep+0x17) [0xe5d17] > /bin/sleep() [0x5827] > /bin/sleep() [0x5600] > /bin/sleep() [0x27b0] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xf3) [0x271e3] > /bin/sleep() [0x287e] close(1) = 0 > /lib/x86_64-linux-gnu/libc-2.30.so(__close_nocancel+0xb) [0x1165bb] > /lib/x86_64-linux-gnu/libc-2.30.so(_IO_file_close_it+0x70) [0x92fc0] > /lib/x86_64-linux-gnu/libc-2.30.so(fclose+0x166) [0x85006] > /bin/sleep() [0x5881] > /bin/sleep() [0x2d27] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_secure_getenv+0x127) [0x49ba7] > /lib/x86_64-linux-gnu/libc-2.30.so(exit+0x20) [0x49d60] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xfa) [0x271ea] > /bin/sleep() [0x287e] close(2) = 0 > /lib/x86_64-linux-gnu/libc-2.30.so(__close_nocancel+0xb) [0x1165bb] > /lib/x86_64-linux-gnu/libc-2.30.so(_IO_file_close_it+0x70) [0x92fc0] > /lib/x86_64-linux-gnu/libc-2.30.so(fclose+0x166) [0x85006] > /bin/sleep() [0x5881] > /bin/sleep() [0x2d4d] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_secure_getenv+0x127) [0x49ba7] > /lib/x86_64-linux-gnu/libc-2.30.so(exit+0x20) [0x49d60] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xfa) [0x271ea] > /bin/sleep() [0x287e] exit_group(0) = ? +++ exited with 0 +++ > /lib/x86_64-linux-gnu/libc-2.30.so(_exit+0x36) [0xe5fe6] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_secure_getenv+0x242) [0x49cc2] > /lib/x86_64-linux-gnu/libc-2.30.so(exit+0x20) [0x49d60] > /lib/x86_64-linux-gnu/libc-2.30.so(__libc_start_main+0xfa) [0x271ea] > /bin/sleep(+0x0) [0x287e]
рд╕рд╣реА, рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рдпрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реИрдВред addr2line
рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ)ред
рдПрдХ рджреВрд╕рд░рд╛ рд╕рд╡рд╛рд▓ рд╣реИ: рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ libc
рдореЗрдВ рд░реИрдкрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк syscall
рдирд╛рдордХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
syscall(SYS_kcmp, getpid(), getpid(), KCMP_FILE, 1, fd)
рдПрдХ рдлрд╝рд╛рдЗрд▓ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ ...
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рди рдХреЗрд╡рд▓ рдХрд░реНрдиреЗрд▓ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдУрд░ рд╕реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдПрдкреАрдЖрдИ рднреА рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрджрд┐ рдЖрдк рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА "рд╕реЗрдЯрд┐рдВрдЧ" рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ execve
рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╕ рд░рд╛рдЬреНрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ execve
рдХрд░рдХреЗ рдЬрдЯрд┐рд▓ рдмреИрд╕рд╛рдЦреА рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреБрдЫ рдРрд╕рд╛ "рдХреНрдпреЛрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ stderr
рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рдЖрдк рдмрд╕ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдПрдлрдбреА # 2 ")ред
рдПрдХ рдмрд╛рд░, рдореБрдЭреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдШрдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдмреИрд╕рд╛рдЦреА рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рднреА рдЙрдЪрд┐рдд рд╕реАрдорд╛рдУрдВ рдХреЛ рдкрд╛рд░ рдХрд░ рдЧрдИ, рдФрд░ рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рдереА рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рдерд╛, рдЙрд╕рдХреЗ рдореБрдХрд╛рдмрд▓реЗ libpcap
рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛, рдпрд╣ рдорд╛рдирдХ рдерд╛, рдФрд░ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рдЙрдкрдХрд░рдг рдереЗред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдбрдВрдк рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП libpcap
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП fopen
рдЬрд┐рддрдирд╛ рдХрдард┐рди рд╣реИ: рдЖрдк рдмрд╕ pcap_(f)open_offline
рд╕рд╛рде рдбрдВрдк рдХреЛ pcap_(f)open_offline
рдФрд░ pcap_next_ex
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдХреЗрдЯ рдХреЛ рд╕реНрдХреВрдк рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рд╕рдм рд╣реИ! рдЦреИрд░, рдпрд╣ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдбрдВрдк рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ ...
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ libpcap
рдореЗрдореЛрд░реА рд╕реЗ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдореЗрдВ рджреЗрд░реА рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ "рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛" рдХреЗ рд▓рд┐рдП рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡рд╣ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рддреЛ, рдПрдХ рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдг: рд╣рдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ stdin
рдкрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж 4 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдбрдВрдк рдЧрдардмрдВрдзрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдмрдлрд░ рдЗрдирдкреБрдЯ рдФрд░ рдХреБрдЫ ungetc
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ libpcap
рдЕрднреА рднреА FILE *
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдЪрд▓рддреЗ-рдлрд┐рд░рддреЗ рдЕрдирдкреИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА read
/ write
рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИред
рд╕рдорд╛рдзрд╛рди 1: memfd_create
memfd_create
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ memfd_create
"рдЖрдо рддреМрд░ рдкрд░ рдЧреБрдордирд╛рдо" рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╣реИ рдФрд░ рдореМрдЬреВрдж рд╣реИ рдЬрдмрдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рд╡рд░рдгрдХ рдЗрд╕ рдкрд░ рдЦреБрд▓рд╛ рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╕ рдРрд╕рд╛ рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕реЗ write
рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ write
, lseek
рд░рд┐рд╡рд╛рдЗрдВрдб lseek
, рдФрд░ lseek
рд╕рд╛рде libc
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ:
int fd = memfd_create("pcap-dump-contents", 0); write(fd, buf, length); lseek(fd, 0, SEEK_SET); FILE *file = fdopen(fd, "r");
рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдПрдХ рд╕рд┐рдореНрд▓рд┐рдВрдХ рдореЗрдВ /proc/<PID>/fd
рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
$ ls -l /proc/31747/fd 0 lr-x------ 1 trosinenko trosinenko 64 10 13:12 0 -> /path/to/128test.pcap lrwx------ 1 trosinenko trosinenko 64 10 13:12 1 -> /dev/pts/17 lrwx------ 1 trosinenko trosinenko 64 10 13:12 2 -> /dev/pts/17 lrwx------ 1 trosinenko trosinenko 64 10 13:12 23 -> '/home/trosinenko/.cache/appstream-cache-AH3OA0.mdb (deleted)' lrwx------ 1 trosinenko trosinenko 64 10 13:12 3 -> '/memfd:pcap-dump-contents (deleted)' lrwx------ 1 trosinenko trosinenko 64 10 13:12 57 -> 'socket:[41036]'
рд╕рдорд╛рдзрд╛рди 2: O_TMPFILE рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЦреБрд▓рд╛
рд▓рд┐рдирдХреНрд╕ рдкрд░, рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдк рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рдмрдЬрд╛рдп O_TMPFILE
рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдо O_TMPFILE
рдХрд░ рд╕рдХрддреЗ O_TMPFILE
ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдлрд╝рд╛рдЗрд▓, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рд╕рд╛рд╣рд┐рддреНрдпрд┐рдХ рдЪрд░рд┐рддреНрд░ рдХрд╣рддрд╛ рдерд╛ (рд▓рдЧрднрдЧ), рдпрд╣ рд╡рд╣рд╛рдВ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ ... рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡рддрдГ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рд╡реИрд╕реЗ, рдпрд╣ рдЗрд╕ рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП) ред рдЕрдВрддрд┐рдо рд▓рд┐рдВрдХ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдЕрднреА рднреА рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ linkat
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдЯреНрд░реА рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
int fd = open(".", O_RDWR | O_TMPFILE, S_IRUSR | S_IWUSR); assert(fd != -1); assert(write(fd, buffer + offset, len - offset) == len - offset); assert(lseek(fd, 0, SEEK_SET) == 0); const char *link_to = getenv("LINK_TO"); if (link_to != NULL) { char path[128]; snprintf(path, sizeof(path), "/proc/self/fd/%d", fd); linkat(AT_FDCWD, path, AT_FDCWD, link_to, AT_SYMLINK_FOLLOW); }
рдлрд╝рд╛рдЗрд▓ рдирд╛рдордХрд░рдг рдХреЗ рд╕рд╛рде рдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЛ рднрд░рдиреЗ, рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкреЗрдбрд╝ рд╕реЗ рдкрд░рдорд╛рдгреБ рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг (рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП) #define _GNU_SOURCE #ifdef NDEBUG
$ fallocate -l 128 zero128 $ cat zero128 test.pcap > 128test.pcap $ ./memfd < 128test.pcap Found PCAP dump at offset 128 Read packet: full length = 105 bytes, available 105 bytes. Read packet: full length = 105 bytes, available 105 bytes. Read packet: full length = 66 bytes, available 66 bytes. Read packet: full length = 385 bytes, available 385 bytes. Read packet: full length = 66 bytes, available 66 bytes. ...
userfaultfd: рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдореЗрдВ рдореЗрдореЛрд░реА рдПрд░рд░ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ UNIX рдЬреИрд╕реА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░, рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрд╕ рдХреБрдЫ рднреА рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдкрд░ рдпрд╣ рдПрдХ рд╕реЙрдХреЗрдЯ, рдкрд╛рдЗрдк, рдИрд╡реЗрдВрдЯрдлрд╝реАрдб рдпрд╛ рдПрдХ рдИрдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд▓рд┐рдВрдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░реЗрдЧрд╛ред рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдХрд┐ рдкреГрд╖реНрда рджреЛрд╖ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдо рдмрд╛рдд рд╣реИ: рд╕реНрд╡реИрдк, рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ, рдпрд╣ рд╕рдм ... рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ "рдорд┐рд╕" рдХрд░рддреА рд╣реИ, рддреЛ SIGSEGV рдХреЛ рдЗрд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди SIGSEGV рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рд▓реЗрдирд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдФрд░ рдлрд┐рд░ рднреА, рд╡рд╣рд╛рдБ GNU libsigsegv рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рдВрдбреЛрдЬ (рдПрдЯреАрдЯреАрд╢рди): рдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕, рдпрджрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВ, libsigsegv рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ) ред рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдкрджреНрдзрддрд┐ рджрд┐рдЦрд╛рдИ рджреА, рдЬрд┐рд╕реЗ userfaultfd
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрд╕реА рдирд╛рдо рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░, рд░реАрдбрд┐рдВрдЧ рдФрд░ рд░рд╛рдЗрдЯрд┐рдВрдЧ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдХрдорд╛рдВрдб рд╣реЛрддреА рд╣реИрдВред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде, рдЖрдк рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд░реНрдЪреБрдЕрд▓ рдкрддреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдореГрддрд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд┐рд╣реНрдирд┐рдд рдкреГрд╖реНрда рдкрд░ рдкрд╣рд▓реА рдкрд╣реБрдВрдЪ рдореЗрдВ, рдкреНрд░рд╡рд╛рд╣ рд╕реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдЬреЛ рд╣реБрдЖ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣реИрдВрдбрд▓рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рднрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ "рд╕рдорд╕реНрдпрд╛" рдкреГрд╖реНрда рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд░реНрдиреЗрд▓ рдЗрд╕реЗ рдЖрд░рдВрдн рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрд╕ рдереНрд░реЗрдб рдХреЛ рдЬрдЧрд╛рдПрдЧрд╛ рдЬреЛ рдмрджрд▓ рдЧрдпрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рд╣реИ рдЬрд┐рд╕рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗ рд░реАрдбрд┐рдВрдЧ рдХрдорд╛рдВрдб рдФрд░ рдЙрддреНрддрд░ рдЬрд╛рд░реА рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА userfaultfd
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдХрд╛рд░реНрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕реВрдЪрдирд╛рдПрдВред
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ #define _GNU_SOURCE #ifdef NDEBUG
$ ./userfaultfd UFFD open Before reading Fault: addr = 0x7f46f40d5000 Data at 0x7f46f40d5000: abababab
"рдЧрдгрд┐рдд рдХрд╛ рдкреНрд░рдореБрдЦ рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдпрд╣ рд╕рдм рдПрдХ рд╣реА рд╣реИ?" ┬й
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ stdin
рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ if (fd == 0) ...
- рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИред рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ ...
#define _GNU_SOURCE #include <unistd.h> #include <stdio.h> int main() { int fd = dup(0); printf("stdin is fd %d, too\n", fd); if (fd == 0) printf("stdin"); else printf("not stdin"); return 0; }
$ gcc kcmp.c -o kcmp $ ./kcmp stdin is fd 3, too not stdin
рдУрд╣ ... рд╕рдВрднрд╛рд▓ рдПрдХ рддрд░рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдирд╛рдо рдЕрд▓рдЧ рд╣реИрдВред CRIU - рдЪреЗрдХрдкреЙрдЗрдВрдЯ / рд░рд┐рд╕реНрдЯреЛрд░ рдЗрди рдпреВрдЬрд░реНрд╕рд╕реНрдкреЗрд╕ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред , , . userspace-, , , kcmp
: PID, , , , , :
#define _GNU_SOURCE #include <linux/kcmp.h> #include <syscall.h> #include <unistd.h> #include <stdio.h> int main() { int fd = dup(0); printf("stdin is fd %d, too\n", fd); int pid = getpid(); if (syscall(SYS_kcmp, pid, pid, KCMP_FILE /* _FILES! */, 0 /* stdin fd */, fd) == 0) printf("stdin\n"); else printf("not stdin\n"); if (syscall(SYS_kcmp, pid, pid, KCMP_FILE, 1 /* stdout fd */, fd) == 0) printf("stdout\n"); else printf("not stdout\n"); return 0; }
$ ./kcmp stdin is fd 3, too stdin stdout
! , ...
$ ls -l /proc/self/fd 0 lrwx------ 1 trosinenko trosinenko 64 10 14:45 0 -> /dev/pts/17 lrwx------ 1 trosinenko trosinenko 64 10 14:45 1 -> /dev/pts/17 lrwx------ 1 trosinenko trosinenko 64 10 14:45 2 -> /dev/pts/17 lrwx------ 1 trosinenko trosinenko 64 10 14:45 23 -> '/home/trosinenko/.cache/appstream-cache-AH3OA0.mdb (deleted)' lr-x------ 1 trosinenko trosinenko 64 10 14:45 3 -> /proc/17265/fd lrwx------ 1 trosinenko trosinenko 64 10 14:45 57 -> 'socket:[41036]'
, , , , . , bash , ls
!
$ ./kcmp < kcmp.c stdin is fd 3, too stdin not stdout
, тАФ -, best effort - .
, ...
- тАж JIT- userspace? , eBPF- . , ( , , -) . ., JIT-, . , , BPF.
- тАж ? ,
sigaltstack
. - тАж , :
readahead
oldolduname
...