1 | #include "utils.h" |
2 | #include <string> |
3 | |
4 | std::vector<std::string> SplitWith(std::string str, |
5 | const std::string& delimiter) { |
6 | std::vector<std::string> ret; |
7 | size_t pos; |
8 | while ((pos = str.find(delimiter)) != std::string::npos) { |
9 | ret.emplace_back(str.substr(0, pos)); |
10 | str.erase(0, pos + delimiter.length()); |
11 | } |
12 | return ret; |
13 | } |
14 | |
15 | std::string ShowRelocationType(int type) { |
16 | switch (type) { |
17 | case R_X86_64_NONE: |
18 | return "R_X86_64_NONE" ; |
19 | case R_X86_64_64: |
20 | return "R_X86_64_64" ; |
21 | case R_X86_64_PC32: |
22 | return "R_X86_64_PC32" ; |
23 | case R_X86_64_GOT32: |
24 | return "R_X86_64_GOT32" ; |
25 | case R_X86_64_PLT32: |
26 | return "R_X86_64_PLT32" ; |
27 | case R_X86_64_COPY: |
28 | return "R_X86_64_COPY" ; |
29 | case R_X86_64_GLOB_DAT: |
30 | return "R_X86_64_GLOB_DAT" ; |
31 | case R_X86_64_JUMP_SLOT: |
32 | return "R_X86_64_JUMP_SLOT" ; |
33 | case R_X86_64_RELATIVE: |
34 | return "R_X86_64_RELATIVE" ; |
35 | case R_X86_64_GOTPCREL: |
36 | return "R_X86_64_GOTPCREL" ; |
37 | case R_X86_64_32: |
38 | return "R_X86_64_32" ; |
39 | case R_X86_64_32S: |
40 | return "R_X86_64_32S" ; |
41 | case R_X86_64_16: |
42 | return "R_X86_64_16" ; |
43 | case R_X86_64_PC16: |
44 | return "R_X86_64_PC16" ; |
45 | case R_X86_64_8: |
46 | return "R_X86_64_8" ; |
47 | case R_X86_64_PC8: |
48 | return "R_X86_64_PC8" ; |
49 | case R_X86_64_DTPMOD64: |
50 | return "R_X86_64_DTPMOD64" ; |
51 | case R_X86_64_DTPOFF64: |
52 | return "R_X86_64_DTPOFF64" ; |
53 | case R_X86_64_TPOFF64: |
54 | return "R_X86_64_TPOFF64" ; |
55 | case R_X86_64_TLSGD: |
56 | return "R_X86_64_TLSGD" ; |
57 | case R_X86_64_TLSLD: |
58 | return "R_X86_64_TLSLD" ; |
59 | case R_X86_64_DTPOFF32: |
60 | return "R_X86_64_DTPOFF32" ; |
61 | case R_X86_64_GOTTPOFF: |
62 | return "R_X86_64_GOTTPOFF" ; |
63 | case R_X86_64_TPOFF32: |
64 | return "R_X86_64_TPOFF32" ; |
65 | case R_X86_64_PC64: |
66 | return "R_X86_64_PC64" ; |
67 | case R_X86_64_GOTOFF64: |
68 | return "R_X86_64_GOTOFF64" ; |
69 | case R_X86_64_GOTPC32: |
70 | return "R_X86_64_GOTPC32" ; |
71 | case R_X86_64_GOT64: |
72 | return "R_X86_64_GOT64" ; |
73 | case R_X86_64_GOTPCREL64: |
74 | return "R_X86_64_GOTPCREL64" ; |
75 | case R_X86_64_GOTPC64: |
76 | return "R_X86_64_GOTPC64" ; |
77 | case R_X86_64_GOTPLT64: |
78 | return "R_X86_64_GOTPLT64" ; |
79 | case R_X86_64_PLTOFF64: |
80 | return "R_X86_64_PLTOFF64" ; |
81 | case R_X86_64_SIZE32: |
82 | return "R_X86_64_SIZE32" ; |
83 | case R_X86_64_SIZE64: |
84 | return "R_X86_64_SIZE64" ; |
85 | case R_X86_64_GOTPC32_TLSDESC: |
86 | return "R_X86_64_GOTPC32_TLSDESC" ; |
87 | case R_X86_64_TLSDESC: |
88 | return "R_X86_64_TLSDESC" ; |
89 | case R_X86_64_IRELATIVE: |
90 | return "R_X86_64_IRELATIVE" ; |
91 | case R_X86_64_RELATIVE64: |
92 | return "R_X86_64_RELATIVE64" ; |
93 | case R_X86_64_GOTPCRELX: |
94 | return "R_X86_64_GOTPCRELX" ; |
95 | case R_X86_64_REX_GOTPCRELX: |
96 | return "R_X86_64_REX_GOTPCRELX" ; |
97 | case R_X86_64_NUM: |
98 | return "R_X86_64_NUM" ; |
99 | default: { |
100 | return HexString(type, 4); |
101 | } |
102 | } |
103 | } |
104 | |
105 | std::string ShowRela(const Elf64_Rela& r) { |
106 | std::stringstream ss; |
107 | ss << "Elf_Rela{r_offset=" << HexString(r.r_offset, 8) |
108 | << ", r_info=" << HexString(r.r_info, 8) |
109 | << ", ELF64_R_SYM(r.r_info)=" << HexString(ELF64_R_SYM(r.r_info), 4) |
110 | << ", ELF64_R_TYPE(r.r_info)=" |
111 | << ShowRelocationType(ELF64_R_TYPE(r.r_info)) |
112 | << ", r_addend=" << HexString(r.r_addend, 8) << "}" ; |
113 | return ss.str(); |
114 | } |
115 | |
116 | std::string ShowSTB(unsigned char bind) { |
117 | switch (bind) { |
118 | case STB_LOCAL: |
119 | return "STB_LOCAL" ; |
120 | case STB_GLOBAL: |
121 | return "STB_GLOBAL" ; |
122 | case STB_WEAK: |
123 | return "STB_WEAK" ; |
124 | case STB_NUM: |
125 | return "STB_NUM" ; |
126 | case STB_GNU_UNIQUE: |
127 | return "STB_GNU_UNIQUE" ; |
128 | case STB_HIOS: |
129 | return "STB_HIOS" ; |
130 | case STB_LOPROC: |
131 | return "STB_LOPROC" ; |
132 | case STB_HIPROC: |
133 | return "STB_HIPROC" ; |
134 | default: { |
135 | return std::to_string(bind); |
136 | } |
137 | } |
138 | } |
139 | |
140 | std::string ShowSTT(unsigned char type) { |
141 | switch (type) { |
142 | case STT_NOTYPE: |
143 | return "STT_NOTYPE" ; |
144 | case STT_OBJECT: |
145 | return "STT_OBJECT" ; |
146 | case STT_FUNC: |
147 | return "STT_FUNC" ; |
148 | case STT_SECTION: |
149 | return "STT_SECTION" ; |
150 | case STT_FILE: |
151 | return "STT_FILE" ; |
152 | case STT_COMMON: |
153 | return "STT_COMMON" ; |
154 | case STT_TLS: |
155 | return "STT_TLS" ; |
156 | case STT_NUM: |
157 | return "STT_NUM" ; |
158 | case STT_GNU_IFUNC: |
159 | return "STT_GNU_IFUNC" ; |
160 | default: { |
161 | LOG(FATAL) << LOG_KEY(type); |
162 | std::abort(); |
163 | } |
164 | } |
165 | } |
166 | |
167 | std::string ShowSym(const Elf64_Sym& s, const char* strtab) { |
168 | std::stringstream ss; |
169 | std::string name = strtab + s.st_name; |
170 | unsigned char bind = ELF64_ST_BIND(s.st_info); |
171 | unsigned char type = ELF64_ST_TYPE(s.st_info); |
172 | ss << "Elf64_Sym{st_name=" << name |
173 | << ", ELF64_ST_BIND(st_info)=" << ShowSTB(bind) |
174 | << ", ELF64_ST_TYPE(st_info)=" << ShowSTT(type) |
175 | << ", st_other=" << s.st_other << ", st_shndx=" << s.st_shndx |
176 | << ", st_value=" << HexString(s.st_value) |
177 | << ", st_size=" << HexString(s.st_size) << "}" ; |
178 | return ss.str(); |
179 | } |
180 | |