1#include "utils.h"
2#include <string>
3
4std::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
15std::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
105std::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
116std::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
140std::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
167std::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