NOTE: This is a working copy. This tutorial is unfinished and may contain inaccuracies.
I've written the title of this tutorial in Chinese, as I suspect that its contents may, at first glance, appear similarly incomprehensible to the audience.
However, just as I can sketch for you the following...
可執行文件 = (可 = can) + (執行 = execute) + (文件 = file) = executable (file)
內容 = contents
分析 = analysis
工具 = tools
Linux可執行文件的內容分析工具 = Linux Tools for Analysing the Contents of Executables
(more specifically, of course, ELF object files)
... so can we break down the majority of the complexity behind:
- the ELF (executable and linkable format),
- object files,
- how executables are executed,
- how C programmes work,
- how the C standard library works,
- and what these three tools are used for.
In the end, it comes down to reading source code and understanding the protocols and mechanisms that have evolved around programme execution.
The purpose of this tutorial isn't to teach you everything about these tools or about executable formats. It is to demystify aspects of programme execution on Linux and demonstrate how accessible this knowledge is.
The word ELF in this tutorial refers to a specific format and protocol for executable files. There is no equivalent protocol in Python, because Python is an interpreted language. An interpreter sits between the Python programme you want to execute and the operating system on which the programme is executed. That interpreter may itself be written in an interpreted language, but, inevitably, some piece of code must interact directly with the operating system, and this code will need to be structured in a fashion that the OS can understand. ELF is one such format, and there are many others. You can even write your binary format!
Here's a simple introductory document on:
ELF How-To: http://cs.mipt.ru/docs/comp/eng/os/linux/howto/howto_english/elf/elf-howto.html
Wikipedia also has a decent overview: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
As you can see from these documents, ELF is really just a file format that is interpreted by some code in the kernel. If you're curious, take a look at fs/exec.c:do_execve_common
which is called when we execute a programme:
https://github.com/torvalds/linux/blob/96c57ade7e9ba2d1deba635a5989cc111f185dca/fs/exec.c#L1428
For ELF binaries, take a look at fs/binfmt_elf.c:load_elf_binary
:
https://github.com/torvalds/linux/blob/master/fs/binfmt_elf.c#L571
In the end, this comes down to just formats and code to process files in those formats.
As a side note, if you use apt
, you can retrieve the code for any programme installed on your computer using apt-get source
. For the tools discussed here, do:
$ apt-get source binutils
The three tools discussed here are packaged as binutils
and distributed by GNU/FSF.
Here's the homepage for these tools with descriptions of what they each do:
https://www.gnu.org/software/binutils/
- nm - Lists symbols from object files.
- objdump - Displays information from object files.
- readelf - Displays information from any ELF format object file.
These tools are just programmes written in C that read in files written in the ELF [format] and spits out interesting information about them.
If you're curious how these tools work, just read the source!
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=tree
But before you read the source, read the manpages to get an overview of what these tools do:
man readelf
http://linuxcommand.org/man_pages/readelf1.html
man objdump
http://linuxcommand.org/man_pages/objdump1.html
man nm
http://linuxcommand.org/man_pages/nm1.html
$ nm -l python3.4
00000000004259c9 T PyRun_SimpleString /tmp/Python-3.4.0rc1/Python/pythonrun.c:2969
0000000000421d36 T PyRun_SimpleStringFlags /tmp/Python-3.4.0rc1/Python/pythonrun.c:1629
0000000000425993 T PyRun_String /tmp/Python-3.4.0rc1/Python/pythonrun.c:2962
0000000000423afc T PyRun_StringFlags /tmp/Python-3.4.0rc1/Python/pythonrun.c:2091
0000000000496b94 T PySeqIter_New /tmp/Python-3.4.0rc1/Objects/iterobject.c:12
000000000091a6e0 D PySeqIter_Type /tmp/Python-3.4.0rc1/Objects/iterobject.c:131
0000000000463e13 T _PySequence_BytesToCharpArray /tmp/Python-3.4.0rc1/Objects/abstract.c:2698
000000000045fe72 T PySequence_Check /tmp/Python-3.4.0rc1/Objects/abstract.c:1358
000000000045ff5f T PySequence_Concat /tmp/Python-3.4.0rc1/Objects/abstract.c:1393
000000000046146f T PySequence_Contains /tmp/Python-3.4.0rc1/Objects/abstract.c:1875
0000000000461445 T PySequence_Count /tmp/Python-3.4.0rc1/Objects/abstract.c:1866
0000000000460823 T PySequence_DelItem /tmp/Python-3.4.0rc1/Objects/abstract.c:1571
$ objdump -d python3.4
python3.4: file format elf64-x86-64
Disassembly of section .init:
0000000000419558 <_init>:
419558: 48 83 ec 08 sub $0x8,%rsp
41955c: e8 9b 14 00 00 callq 41a9fc <call_gmon_start>
419561: 48 83 c4 08 add $0x8,%rsp
419565: c3 retq
Disassembly of section .plt:
0000000000419570 <wcscat@plt-0x10>:
419570: ff 35 92 0a 4e 00 pushq 0x4e0a92(%rip) # 8fa008 <_GLOBAL_OFFSET_TABLE_+0x8>
419576: ff 25 94 0a 4e 00 jmpq *0x4e0a94(%rip) # 8fa010 <_GLOBAL_OFFSET_TABLE_+0x10>
41957c: 0f 1f 40 00 nopl 0x0(%rax)
0000000000419580 <wcscat@plt>:
419580: ff 25 92 0a 4e 00 jmpq *0x4e0a92(%rip) # 8fa018 <_GLOBAL_OFFSET_TABLE_+0x18>
419586: 68 00 00 00 00 pushq $0x0
41958b: e9 e0 ff ff ff jmpq 419570 <_init+0x18>
000000000045e9fb <PyNumber_Multiply>:
45e9fb: 55 push %rbp
45e9fc: 48 89 e5 mov %rsp,%rbp
45e9ff: 48 83 ec 30 sub $0x30,%rsp
45ea03: 48 89 7d d8 mov %rdi,-0x28(%rbp)
45ea07: 48 89 75 d0 mov %rsi,-0x30(%rbp)
45ea0b: 48 8b 4d d0 mov -0x30(%rbp),%rcx
45ea0f: 48 8b 45 d8 mov -0x28(%rbp),%rax
45ea13: ba 10 00 00 00 mov $0x10,%edx
45ea18: 48 89 ce mov %rcx,%rsi
45ea1b: 48 89 c7 mov %rax,%rdi
45ea1e: e8 c6 f4 ff ff callq 45dee9 <binary_op1>
45ea23: 48 89 45 e0 mov %rax,-0x20(%rbp)
45ea27: 48 81 7d e0 e0 01 92 cmpq $0x9201e0,-0x20(%rbp)
45ea2e: 00
45ea2f: 0f 85 0a 01 00 00 jne 45eb3f <PyNumber_Multiply+0x144>
45ea35: 48 8b 45 d8 mov -0x28(%rbp),%rax
45ea39: 48 8b 40 18 mov 0x18(%rax),%rax
45ea3d: 48 8b 40 78 mov 0x78(%rax),%rax
45ea41: 48 89 45 e8 mov %rax,-0x18(%rbp)
45ea45: 48 8b 45 d0 mov -0x30(%rbp),%rax
45ea49: 48 8b 40 18 mov 0x18(%rax),%rax
45ea4d: 48 8b 40 78 mov 0x78(%rax),%rax
45ea51: 48 89 45 f0 mov %rax,-0x10(%rbp)
45ea55: 48 8b 45 e0 mov -0x20(%rbp),%rax
45ea59: 48 89 45 f8 mov %rax,-0x8(%rbp)
45ea5d: 48 8b 05 54 15 52 00 mov 0x521554(%rip),%rax # 97ffb8 <_Py_RefTotal>
45ea64: 48 83 e8 01 sub $0x1,%rax
45ea68: 48 89 05 49 15 52 00 mov %rax,0x521549(%rip) # 97ffb8 <_Py_RefTotal>
45ea6f: 48 8b 45 f8 mov -0x8(%rbp),%rax
45ea73: 48 8b 40 10 mov 0x10(%rax),%rax
45ea77: 48 8d 50 ff lea -0x1(%rax),%rdx
45ea7b: 48 8b 45 f8 mov -0x8(%rbp),%rax
45ea7f: 48 89 50 10 mov %rdx,0x10(%rax)
45ea83: 48 8b 45 f8 mov -0x8(%rbp),%rax
45ea87: 48 8b 40 10 mov 0x10(%rax),%rax
45ea8b: 48 85 c0 test %rax,%rax
45ea8e: 74 25 je 45eab5 <PyNumber_Multiply+0xba>
45ea90: 48 8b 45 f8 mov -0x8(%rbp),%rax
45ea94: 48 8b 40 10 mov 0x10(%rax),%rax
45ea98: 48 85 c0 test %rax,%rax
45ea9b: 79 24 jns 45eac1 <PyNumber_Multiply+0xc6>
45ea9d: 48 8b 45 f8 mov -0x8(%rbp),%rax
45eaa1: 48 89 c2 mov %rax,%rdx
45eaa4: be 9a 03 00 00 mov $0x39a,%esi
45eaa9: bf f2 2f 67 00 mov $0x672ff2,%edi
45eaae: e8 08 67 06 00 callq 4c51bb <_Py_NegativeRefcount>
45eab3: eb 0c jmp 45eac1 <PyNumber_Multiply+0xc6>
45eab5: 48 8b 45 f8 mov -0x8(%rbp),%rax
45eab9: 48 89 c7 mov %rax,%rdi
45eabc: e8 33 a2 06 00 callq 4c8cf4 <_Py_Dealloc>
45eac1: 48 83 7d e8 00 cmpq $0x0,-0x18(%rbp)
45eac6: 74 2a je 45eaf2 <PyNumber_Multiply+0xf7>
45eac8: 48 8b 45 e8 mov -0x18(%rbp),%rax
45eacc: 48 8b 40 10 mov 0x10(%rax),%rax
45ead0: 48 85 c0 test %rax,%rax
45ead3: 74 1d je 45eaf2 <PyNumber_Multiply+0xf7>
45ead5: 48 8b 45 e8 mov -0x18(%rbp),%rax
45ead9: 48 8b 40 10 mov 0x10(%rax),%rax
45eadd: 48 8b 55 d0 mov -0x30(%rbp),%rdx
45eae1: 48 8b 4d d8 mov -0x28(%rbp),%rcx
45eae5: 48 89 ce mov %rcx,%rsi
45eae8: 48 89 c7 mov %rax,%rdi
45eaeb: e8 72 fe ff ff callq 45e962 <sequence_repeat>
45eaf0: eb 51 jmp 45eb43 <PyNumber_Multiply+0x148>
45eaf2: 48 83 7d f0 00 cmpq $0x0,-0x10(%rbp)
45eaf7: 74 2a je 45eb23 <PyNumber_Multiply+0x128>
45eaf9: 48 8b 45 f0 mov -0x10(%rbp),%rax
45eafd: 48 8b 40 10 mov 0x10(%rax),%rax
45eb01: 48 85 c0 test %rax,%rax
45eb04: 74 1d je 45eb23 <PyNumber_Multiply+0x128>
45eb06: 48 8b 45 f0 mov -0x10(%rbp),%rax
45eb0a: 48 8b 40 10 mov 0x10(%rax),%rax
45eb0e: 48 8b 55 d8 mov -0x28(%rbp),%rdx
45eb12: 48 8b 4d d0 mov -0x30(%rbp),%rcx
45eb16: 48 89 ce mov %rcx,%rsi
45eb19: 48 89 c7 mov %rax,%rdi
45eb1c: e8 41 fe ff ff callq 45e962 <sequence_repeat>
45eb21: eb 20 jmp 45eb43 <PyNumber_Multiply+0x148>
45eb23: 48 8b 4d d0 mov -0x30(%rbp),%rcx
45eb27: 48 8b 45 d8 mov -0x28(%rbp),%rax
45eb2b: ba ec 33 67 00 mov $0x6733ec,%edx
45eb30: 48 89 ce mov %rcx,%rsi
45eb33: 48 89 c7 mov %rax,%rdi
45eb36: e8 8c f6 ff ff callq 45e1c7 <binop_type_error>
45eb3b: 48 89 45 e0 mov %rax,-0x20(%rbp)
45eb3f: 48 8b 45 e0 mov -0x20(%rbp),%rax
45eb43: c9 leaveq
45eb44: c3 retq
$ readelf -all python3.4
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: 0x41a9d0
Start of program headers: 64 (bytes into file)
Start of section headers: 6131376 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 38
Section header string table index: 35
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .note.gnu.build-i NOTE 0000000000400274 00000274
0000000000000024 0000000000000000 A 0 0 4
[ 4] .gnu.hash GNU_HASH 0000000000400298 00000298
00000000000030b8 0000000000000000 A 5 0 8
[ 5] .dynsym DYNSYM 0000000000403350 00003350
000000000000b1a8 0000000000000018 A 6 1 8
[ 6] .dynstr STRTAB 000000000040e4f8 0000e4f8
0000000000008172 0000000000000000 A 0 0 1
[ 7] .gnu.version VERSYM 000000000041666a 0001666a
0000000000000ece 0000000000000002 A 5 0 2
[ 8] .gnu.version_r VERNEED 0000000000417538 00017538
0000000000000130 0000000000000000 A 6 5 8
[ 9] .rela.dyn RELA 0000000000417668 00017668
0000000000000078 0000000000000018 A 5 0 8
[10] .rela.plt RELA 00000000004176e0 000176e0
0000000000001e78 0000000000000018 A 5 12 8
[11] .init PROGBITS 0000000000419558 00019558
000000000000000e 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 0000000000419570 00019570
0000000000001460 0000000000000010 AX 0 0 16
[13] .text PROGBITS 000000000041a9d0 0001a9d0
000000000024da34 0000000000000000 AX 0 0 16
[14] .fini PROGBITS 0000000000668404 00268404
0000000000000009 0000000000000000 AX 0 0 4
[15] .rodata PROGBITS 0000000000668420 00268420
000000000006258f 0000000000000000 A 0 0 32
[16] .eh_frame_hdr PROGBITS 00000000006ca9b0 002ca9b0
00000000000094e4 0000000000000000 A 0 0 4
[17] .eh_frame PROGBITS 00000000006d3e98 002d3e98
0000000000025aec 0000000000000000 A 0 0 8
[18] .init_array INIT_ARRAY 00000000008f9dd0 002f9dd0
0000000000000008 0000000000000000 WA 0 0 8
[19] .fini_array FINI_ARRAY 00000000008f9dd8 002f9dd8
0000000000000008 0000000000000000 WA 0 0 8
[20] .jcr PROGBITS 00000000008f9de0 002f9de0
0000000000000008 0000000000000000 WA 0 0 8
[21] .dynamic DYNAMIC 00000000008f9de8 002f9de8
0000000000000210 0000000000000010 WA 6 0 8
[22] .got PROGBITS 00000000008f9ff8 002f9ff8
0000000000000008 0000000000000008 WA 0 0 8
[23] .got.plt PROGBITS 00000000008fa000 002fa000
0000000000000a40 0000000000000008 WA 0 0 8
[24] .data PROGBITS 00000000008faa40 002faa40
0000000000069390 0000000000000000 WA 0 0 32
[25] .bss NOBITS 0000000000963de0 00363dd0
000000000001c2e0 0000000000000000 WA 0 0 32
[26] .comment PROGBITS 0000000000000000 00363dd0
000000000000006b 0000000000000001 MS 0 0 1
[27] .debug_aranges PROGBITS 0000000000000000 00363e3b
0000000000001700 0000000000000000 0 0 1
[28] .debug_info PROGBITS 0000000000000000 0036553b
00000000000f4563 0000000000000000 0 0 1
[29] .debug_abbrev PROGBITS 0000000000000000 00459a9e
0000000000015b78 0000000000000000 0 0 1
[30] .debug_line PROGBITS 0000000000000000 0046f616
00000000000b0554 0000000000000000 0 0 1
[31] .debug_str PROGBITS 0000000000000000 0051fb6a
00000000000598ae 0000000000000001 MS 0 0 1
[32] .debug_ranges PROGBITS 0000000000000000 00579418
0000000000009590 0000000000000000 0 0 1
[33] .debug_macro PROGBITS 0000000000000000 005829a8
00000000000470be 0000000000000000 0 0 1
[34] .debug_types PROGBITS 0000000000000000 005c9a66
000000000000f2d8 0000000000000000 0 0 1
[35] .shstrtab STRTAB 0000000000000000 005d8d3e
0000000000000170 0000000000000000 0 0 1
[36] .symtab SYMTAB 0000000000000000 005d9830
0000000000035fe8 0000000000000018 37 7322 8
[37] .strtab STRTAB 0000000000000000 0060f818
0000000000025576 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
There are no section groups in this file.
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000002f9984 0x00000000002f9984 R E 200000
LOAD 0x00000000002f9dd0 0x00000000008f9dd0 0x00000000008f9dd0
0x000000000006a000 0x00000000000862f0 RW 200000
DYNAMIC 0x00000000002f9de8 0x00000000008f9de8 0x00000000008f9de8
0x0000000000000210 0x0000000000000210 RW 8
NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x00000000002ca9b0 0x00000000006ca9b0 0x00000000006ca9b0
0x00000000000094e4 0x00000000000094e4 R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 8
GNU_RELRO 0x00000000002f9dd0 0x00000000008f9dd0 0x00000000008f9dd0
0x0000000000000230 0x0000000000000230 R 1
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dynamic .got
Dynamic section at offset 0x2f9de8 contains 28 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libutil.so.1]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x419558
0x000000000000000d (FINI) 0x668404
0x0000000000000019 (INIT_ARRAY) 0x8f9dd0
0x000000000000001b (INIT_ARRAYSZ) 8 (bytes)
0x000000000000001a (FINI_ARRAY) 0x8f9dd8
0x000000000000001c (FINI_ARRAYSZ) 8 (bytes)
0x000000006ffffef5 (GNU_HASH) 0x400298
0x0000000000000005 (STRTAB) 0x40e4f8
0x0000000000000006 (SYMTAB) 0x403350
0x000000000000000a (STRSZ) 33138 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x8fa000
0x0000000000000002 (PLTRELSZ) 7800 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x4176e0
0x0000000000000007 (RELA) 0x417668
0x0000000000000008 (RELASZ) 120 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x417538
0x000000006fffffff (VERNEEDNUM) 5
0x000000006ffffff0 (VERSYM) 0x41666a
0x0000000000000000 (NULL) 0x0
Relocation section '.rela.dyn' at offset 0x17668 contains 5 entries:
Offset Info Type Sym. Value Sym. Name + Addend
0000008f9ff8 009a00000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
000000963de0 059b00000005 R_X86_64_COPY 0000000000963de0 stdout + 0
000000963de8 02aa00000005 R_X86_64_COPY 0000000000963de8 stdin + 0
000000963df0 015400000005 R_X86_64_COPY 0000000000963df0 __environ + 0
000000963df8 018e00000005 R_X86_64_COPY 0000000000963df8 stderr + 0
Relocation section '.rela.plt' at offset 0x176e0 contains 325 entries:
Offset Info Type Sym. Value Sym. Name + Addend
0000008fa018 000100000007 R_X86_64_JUMP_SLO 0000000000000000 wcscat + 0
0000008fa020 000200000007 R_X86_64_JUMP_SLO 0000000000000000 getenv + 0
0000008fa028 000300000007 R_X86_64_JUMP_SLO 0000000000000000 raise + 0
0000008fa030 000400000007 R_X86_64_JUMP_SLO 0000000000000000 mkfifoat + 0
0000008fa038 067700000007 R_X86_64_JUMP_SLO 00000000004195c0 free + 0
0000008fa040 000500000007 R_X86_64_JUMP_SLO 0000000000000000 wcscmp + 0
0000008fa048 000600000007 R_X86_64_JUMP_SLO 0000000000000000 utimensat + 0
0000008fa050 000700000007 R_X86_64_JUMP_SLO 0000000000000000 putchar + 0
0000008fa058 000800000007 R_X86_64_JUMP_SLO 0000000000000000 pthread_create + 0
0000008fa060 000900000007 R_X86_64_JUMP_SLO 0000000000000000 pthread_sigmask + 0
0000008fa068 000a00000007 R_X86_64_JUMP_SLO 0000000000000000 funlockfile + 0
0000008fa070 000b00000007 R_X86_64_JUMP_SLO 0000000000000000 pthread_detach + 0
0000008fa078 000c00000007 R_X86_64_JUMP_SLO 0000000000000000 sched_getscheduler + 0
0000008fa080 000d00000007 R_X86_64_JUMP_SLO 0000000000000000 abort + 0
0000008fa088 000e00000007 R_X86_64_JUMP_SLO 0000000000000000 __errno_location + 0
0000008fa090 048600000007 R_X86_64_JUMP_SLO 0000000000419670 fdatasync + 0
0000008fa098 000f00000007 R_X86_64_JUMP_SLO 0000000000000000 ldexp + 0
0000008fa0a0 001000000007 R_X86_64_JUMP_SLO 0000000000000000 unlink + 0
0000008fa0a8 001100000007 R_X86_64_JUMP_SLO 0000000000000000 round + 0
0000008fa0b0 001200000007 R_X86_64_JUMP_SLO 0000000000000000 strncpy + 0
0000008fa0b8 001300000007 R_X86_64_JUMP_SLO 0000000000000000 getpriority + 0
0000008fa0c0 001400000007 R_X86_64_JUMP_SLO 0000000000000000 strncmp + 0
0000008fa0c8 001600000007 R_X86_64_JUMP_SLO 0000000000000000 _exit + 0
0000008fa0d0 001700000007 R_X86_64_JUMP_SLO 0000000000000000 wcscoll + 0
0000008fa0d8 001800000007 R_X86_64_JUMP_SLO 0000000000000000 strcpy + 0
0000008fa0e0 02af00000007 R_X86_64_JUMP_SLO 0000000000419710 chroot + 0
0000008fa0e8 001900000007 R_X86_64_JUMP_SLO 0000000000000000 getresgid + 0
0000008fa0f0 001a00000007 R_X86_64_JUMP_SLO 0000000000000000 mkdir + 0
0000008fa0f8 001b00000007 R_X86_64_JUMP_SLO 0000000000000000 flistxattr + 0
0000008fa100 001c00000007 R_X86_64_JUMP_SLO 0000000000000000 writev + 0
0000008fa108 001d00000007 R_X86_64_JUMP_SLO 0000000000000000 unlinkat + 0
0000008fa110 001e00000007 R_X86_64_JUMP_SLO 0000000000000000 puts + 0
0000008fa118 001f00000007 R_X86_64_JUMP_SLO 0000000000000000 ferror + 0
0000008fa120 002000000007 R_X86_64_JUMP_SLO 0000000000000000 getc_unlocked + 0
0000008fa128 002100000007 R_X86_64_JUMP_SLO 0000000000000000 qsort + 0
0000008fa130 002200000007 R_X86_64_JUMP_SLO 0000000000000000 isatty + 0
0000008fa138 002300000007 R_X86_64_JUMP_SLO 0000000000000000 __isnan + 0
0000008fa140 002400000007 R_X86_64_JUMP_SLO 0000000000000000 sigaction + 0
0000008fa148 002500000007 R_X86_64_JUMP_SLO 0000000000000000 fread + 0
0000008fa150 002600000007 R_X86_64_JUMP_SLO 0000000000000000 __finite + 0
0000008fa158 002700000007 R_X86_64_JUMP_SLO 0000000000000000 fsetxattr + 0
0000008fa160 002800000007 R_X86_64_JUMP_SLO 0000000000000000 vsnprintf + 0
0000008fa168 002900000007 R_X86_64_JUMP_SLO 0000000000000000 exp + 0
0000008fa170 002a00000007 R_X86_64_JUMP_SLO 0000000000000000 localeconv + 0
0000008fa178 002b00000007 R_X86_64_JUMP_SLO 0000000000000000 llistxattr + 0
0000008fa180 002c00000007 R_X86_64_JUMP_SLO 0000000000000000 faccessat + 0
0000008fa188 002d00000007 R_X86_64_JUMP_SLO 0000000000000000 mbstowcs + 0
0000008fa190 002e00000007 R_X86_64_JUMP_SLO 0000000000000000 readlink + 0
0000008fa198 002f00000007 R_X86_64_JUMP_SLO 0000000000000000 fcntl + 0
0000008fa1a0 003000000007 R_X86_64_JUMP_SLO 0000000000000000 wcsncat + 0
0000008fa1a8 003100000007 R_X86_64_JUMP_SLO 0000000000000000 write + 0
0000008fa1b0 003200000007 R_X86_64_JUMP_SLO 0000000000000000 getpid + 0
0000008fa1b8 003300000007 R_X86_64_JUMP_SLO 0000000000000000 textdomain + 0
0000008fa1c0 003400000007 R_X86_64_JUMP_SLO 0000000000000000 pthread_kill + 0
0000008fa1c8 003500000007 R_X86_64_JUMP_SLO 0000000000000000 setresuid + 0
0000008fa1d0 003600000007 R_X86_64_JUMP_SLO 0000000000000000 dup3 + 0
0000008fa1d8 003700000007 R_X86_64_JUMP_SLO 0000000000000000 pthread_cond_wait + 0
0000008fa1e0 003800000007 R_X86_64_JUMP_SLO 0000000000000000 fremovexattr + 0
0000008fa1e8 003900000007 R_X86_64_JUMP_SLO 0000000000000000 pathconf + 0
0000008fa1f0 003a00000007 R_X86_64_JUMP_SLO 0000000000000000 clock + 0
0000008fa1f8 003b00000007 R_X86_64_JUMP_SLO 0000000000000000 wcsrchr + 0
0000008fa200 003c00000007 R_X86_64_JUMP_SLO 0000000000000000 fclose + 0
0000008fa208 003d00000007 R_X86_64_JUMP_SLO 0000000000000000 lgetxattr + 0
0000008fa210 003e00000007 R_X86_64_JUMP_SLO 0000000000000000 __sched_cpucount + 0
0000008fa218 003f00000007 R_X86_64_JUMP_SLO 0000000000000000 __xstat64 + 0
0000008fa220 004000000007 R_X86_64_JUMP_SLO 0000000000000000 wait3 + 0
0000008fa228 004100000007 R_X86_64_JUMP_SLO 0000000000000000 opendir + 0
0000008fa230 004200000007 R_X86_64_JUMP_SLO 0000000000000000 getloadavg + 0
0000008fa238 004300000007 R_X86_64_JUMP_SLO 0000000000000000 getpwuid + 0
0000008fa240 004400000007 R_X86_64_JUMP_SLO 0000000000000000 bindtextdomain + 0
0000008fa248 004500000007 R_X86_64_JUMP_SLO 0000000000000000 listxattr + 0
0000008fa250 004600000007 R_X86_64_JUMP_SLO 0000000000000000 rmdir + 0
0000008fa258 004700000007 R_X86_64_JUMP_SLO 0000000000000000 dcgettext + 0
0000008fa260 004800000007 R_X86_64_JUMP_SLO 0000000000000000 strlen + 0
0000008fa268 004900000007 R_X86_64_JUMP_SLO 0000000000000000 chdir + 0
0000008fa270 004a00000007 R_X86_64_JUMP_SLO 0000000000000000 __stack_chk_fail + 0
0000008fa278 004b00000007 R_X86_64_JUMP_SLO 0000000000000000 getuid + 0