relocs.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* This is included from relocs_32/64.c */
  3. #define ElfW(type) _ElfW(ELF_BITS, type)
  4. #define _ElfW(bits, type) __ElfW(bits, type)
  5. #define __ElfW(bits, type) Elf##bits##_##type
  6. #define Elf_Addr ElfW(Addr)
  7. #define Elf_Ehdr ElfW(Ehdr)
  8. #define Elf_Phdr ElfW(Phdr)
  9. #define Elf_Shdr ElfW(Shdr)
  10. #define Elf_Sym ElfW(Sym)
  11. static Elf_Ehdr ehdr;
  12. struct relocs {
  13. uint32_t *offset;
  14. unsigned long count;
  15. unsigned long size;
  16. };
  17. static struct relocs relocs16;
  18. static struct relocs relocs32;
  19. #if ELF_BITS == 64
  20. static struct relocs relocs32neg;
  21. static struct relocs relocs64;
  22. #endif
  23. struct section {
  24. Elf_Shdr shdr;
  25. struct section *link;
  26. Elf_Sym *symtab;
  27. Elf_Rel *reltab;
  28. char *strtab;
  29. };
  30. static struct section *secs;
  31. static const char * const sym_regex_kernel[S_NSYMTYPES] = {
  32. /*
  33. * Following symbols have been audited. There values are constant and do
  34. * not change if bzImage is loaded at a different physical address than
  35. * the address for which it has been compiled. Don't warn user about
  36. * absolute relocations present w.r.t these symbols.
  37. */
  38. [S_ABS] =
  39. "^(xen_irq_disable_direct_reloc$|"
  40. "xen_save_fl_direct_reloc$|"
  41. "VDSO|"
  42. "__crc_)",
  43. /*
  44. * These symbols are known to be relative, even if the linker marks them
  45. * as absolute (typically defined outside any section in the linker script.)
  46. */
  47. [S_REL] =
  48. "^(__init_(begin|end)|"
  49. "__x86_cpu_dev_(start|end)|"
  50. "(__parainstructions|__alt_instructions)(|_end)|"
  51. "(__iommu_table|__apicdrivers|__smp_locks)(|_end)|"
  52. "__(start|end)_pci_.*|"
  53. "__(start|end)_builtin_fw|"
  54. "__(start|stop)___ksymtab(|_gpl|_unused|_unused_gpl|_gpl_future)|"
  55. "__(start|stop)___kcrctab(|_gpl|_unused|_unused_gpl|_gpl_future)|"
  56. "__(start|stop)___param|"
  57. "__(start|stop)___modver|"
  58. "__(start|stop)___bug_table|"
  59. "__tracedata_(start|end)|"
  60. "__(start|stop)_notes|"
  61. "__end_rodata|"
  62. "__end_rodata_aligned|"
  63. "__initramfs_start|"
  64. "(jiffies|jiffies_64)|"
  65. #if ELF_BITS == 64
  66. "__per_cpu_load|"
  67. "init_per_cpu__.*|"
  68. "__end_rodata_hpage_align|"
  69. #endif
  70. "__vvar_page|"
  71. "_end)$"
  72. };
  73. static const char * const sym_regex_realmode[S_NSYMTYPES] = {
  74. /*
  75. * These symbols are known to be relative, even if the linker marks them
  76. * as absolute (typically defined outside any section in the linker script.)
  77. */
  78. [S_REL] =
  79. "^pa_",
  80. /*
  81. * These are 16-bit segment symbols when compiling 16-bit code.
  82. */
  83. [S_SEG] =
  84. "^real_mode_seg$",
  85. /*
  86. * These are offsets belonging to segments, as opposed to linear addresses,
  87. * when compiling 16-bit code.
  88. */
  89. [S_LIN] =
  90. "^pa_",
  91. };
  92. static const char * const *sym_regex;
  93. static regex_t sym_regex_c[S_NSYMTYPES];
  94. static int is_reloc(enum symtype type, const char *sym_name)
  95. {
  96. return sym_regex[type] &&
  97. !regexec(&sym_regex_c[type], sym_name, 0, NULL, 0);
  98. }
  99. static void regex_init(int use_real_mode)
  100. {
  101. char errbuf[128];
  102. int err;
  103. int i;
  104. if (use_real_mode)
  105. sym_regex = sym_regex_realmode;
  106. else
  107. sym_regex = sym_regex_kernel;
  108. for (i = 0; i < S_NSYMTYPES; i++) {
  109. if (!sym_regex[i])
  110. continue;
  111. err = regcomp(&sym_regex_c[i], sym_regex[i],
  112. REG_EXTENDED|REG_NOSUB);
  113. if (err) {
  114. regerror(err, &sym_regex_c[i], errbuf, sizeof(errbuf));
  115. die("%s", errbuf);
  116. }
  117. }
  118. }
  119. static const char *sym_type(unsigned type)
  120. {
  121. static const char *type_name[] = {
  122. #define SYM_TYPE(X) [X] = #X
  123. SYM_TYPE(STT_NOTYPE),
  124. SYM_TYPE(STT_OBJECT),
  125. SYM_TYPE(STT_FUNC),
  126. SYM_TYPE(STT_SECTION),
  127. SYM_TYPE(STT_FILE),
  128. SYM_TYPE(STT_COMMON),
  129. SYM_TYPE(STT_TLS),
  130. #undef SYM_TYPE
  131. };
  132. const char *name = "unknown sym type name";
  133. if (type < ARRAY_SIZE(type_name)) {
  134. name = type_name[type];
  135. }
  136. return name;
  137. }
  138. static const char *sym_bind(unsigned bind)
  139. {
  140. static const char *bind_name[] = {
  141. #define SYM_BIND(X) [X] = #X
  142. SYM_BIND(STB_LOCAL),
  143. SYM_BIND(STB_GLOBAL),
  144. SYM_BIND(STB_WEAK),
  145. #undef SYM_BIND
  146. };
  147. const char *name = "unknown sym bind name";
  148. if (bind < ARRAY_SIZE(bind_name)) {
  149. name = bind_name[bind];
  150. }
  151. return name;
  152. }
  153. static const char *sym_visibility(unsigned visibility)
  154. {
  155. static const char *visibility_name[] = {
  156. #define SYM_VISIBILITY(X) [X] = #X
  157. SYM_VISIBILITY(STV_DEFAULT),
  158. SYM_VISIBILITY(STV_INTERNAL),
  159. SYM_VISIBILITY(STV_HIDDEN),
  160. SYM_VISIBILITY(STV_PROTECTED),
  161. #undef SYM_VISIBILITY
  162. };
  163. const char *name = "unknown sym visibility name";
  164. if (visibility < ARRAY_SIZE(visibility_name)) {
  165. name = visibility_name[visibility];
  166. }
  167. return name;
  168. }
  169. static const char *rel_type(unsigned type)
  170. {
  171. static const char *type_name[] = {
  172. #define REL_TYPE(X) [X] = #X
  173. #if ELF_BITS == 64
  174. REL_TYPE(R_X86_64_NONE),
  175. REL_TYPE(R_X86_64_64),
  176. REL_TYPE(R_X86_64_PC64),
  177. REL_TYPE(R_X86_64_PC32),
  178. REL_TYPE(R_X86_64_GOT32),
  179. REL_TYPE(R_X86_64_PLT32),
  180. REL_TYPE(R_X86_64_COPY),
  181. REL_TYPE(R_X86_64_GLOB_DAT),
  182. REL_TYPE(R_X86_64_JUMP_SLOT),
  183. REL_TYPE(R_X86_64_RELATIVE),
  184. REL_TYPE(R_X86_64_GOTPCREL),
  185. REL_TYPE(R_X86_64_32),
  186. REL_TYPE(R_X86_64_32S),
  187. REL_TYPE(R_X86_64_16),
  188. REL_TYPE(R_X86_64_PC16),
  189. REL_TYPE(R_X86_64_8),
  190. REL_TYPE(R_X86_64_PC8),
  191. #else
  192. REL_TYPE(R_386_NONE),
  193. REL_TYPE(R_386_32),
  194. REL_TYPE(R_386_PC32),
  195. REL_TYPE(R_386_GOT32),
  196. REL_TYPE(R_386_PLT32),
  197. REL_TYPE(R_386_COPY),
  198. REL_TYPE(R_386_GLOB_DAT),
  199. REL_TYPE(R_386_JMP_SLOT),
  200. REL_TYPE(R_386_RELATIVE),
  201. REL_TYPE(R_386_GOTOFF),
  202. REL_TYPE(R_386_GOTPC),
  203. REL_TYPE(R_386_8),
  204. REL_TYPE(R_386_PC8),
  205. REL_TYPE(R_386_16),
  206. REL_TYPE(R_386_PC16),
  207. #endif
  208. #undef REL_TYPE
  209. };
  210. const char *name = "unknown type rel type name";
  211. if (type < ARRAY_SIZE(type_name) && type_name[type]) {
  212. name = type_name[type];
  213. }
  214. return name;
  215. }
  216. static const char *sec_name(unsigned shndx)
  217. {
  218. const char *sec_strtab;
  219. const char *name;
  220. sec_strtab = secs[ehdr.e_shstrndx].strtab;
  221. name = "<noname>";
  222. if (shndx < ehdr.e_shnum) {
  223. name = sec_strtab + secs[shndx].shdr.sh_name;
  224. }
  225. else if (shndx == SHN_ABS) {
  226. name = "ABSOLUTE";
  227. }
  228. else if (shndx == SHN_COMMON) {
  229. name = "COMMON";
  230. }
  231. return name;
  232. }
  233. static const char *sym_name(const char *sym_strtab, Elf_Sym *sym)
  234. {
  235. const char *name;
  236. name = "<noname>";
  237. if (sym->st_name) {
  238. name = sym_strtab + sym->st_name;
  239. }
  240. else {
  241. name = sec_name(sym->st_shndx);
  242. }
  243. return name;
  244. }
  245. static Elf_Sym *sym_lookup(const char *symname)
  246. {
  247. int i;
  248. for (i = 0; i < ehdr.e_shnum; i++) {
  249. struct section *sec = &secs[i];
  250. long nsyms;
  251. char *strtab;
  252. Elf_Sym *symtab;
  253. Elf_Sym *sym;
  254. if (sec->shdr.sh_type != SHT_SYMTAB)
  255. continue;
  256. nsyms = sec->shdr.sh_size/sizeof(Elf_Sym);
  257. symtab = sec->symtab;
  258. strtab = sec->link->strtab;
  259. for (sym = symtab; --nsyms >= 0; sym++) {
  260. if (!sym->st_name)
  261. continue;
  262. if (strcmp(symname, strtab + sym->st_name) == 0)
  263. return sym;
  264. }
  265. }
  266. return 0;
  267. }
  268. #if BYTE_ORDER == LITTLE_ENDIAN
  269. #define le16_to_cpu(val) (val)
  270. #define le32_to_cpu(val) (val)
  271. #define le64_to_cpu(val) (val)
  272. #endif
  273. #if BYTE_ORDER == BIG_ENDIAN
  274. #define le16_to_cpu(val) bswap_16(val)
  275. #define le32_to_cpu(val) bswap_32(val)
  276. #define le64_to_cpu(val) bswap_64(val)
  277. #endif
  278. static uint16_t elf16_to_cpu(uint16_t val)
  279. {
  280. return le16_to_cpu(val);
  281. }
  282. static uint32_t elf32_to_cpu(uint32_t val)
  283. {
  284. return le32_to_cpu(val);
  285. }
  286. #define elf_half_to_cpu(x) elf16_to_cpu(x)
  287. #define elf_word_to_cpu(x) elf32_to_cpu(x)
  288. #if ELF_BITS == 64
  289. static uint64_t elf64_to_cpu(uint64_t val)
  290. {
  291. return le64_to_cpu(val);
  292. }
  293. #define elf_addr_to_cpu(x) elf64_to_cpu(x)
  294. #define elf_off_to_cpu(x) elf64_to_cpu(x)
  295. #define elf_xword_to_cpu(x) elf64_to_cpu(x)
  296. #else
  297. #define elf_addr_to_cpu(x) elf32_to_cpu(x)
  298. #define elf_off_to_cpu(x) elf32_to_cpu(x)
  299. #define elf_xword_to_cpu(x) elf32_to_cpu(x)
  300. #endif
  301. static void read_ehdr(FILE *fp)
  302. {
  303. if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) {
  304. die("Cannot read ELF header: %s\n",
  305. strerror(errno));
  306. }
  307. if (memcmp(ehdr.e_ident, ELFMAG, SELFMAG) != 0) {
  308. die("No ELF magic\n");
  309. }
  310. if (ehdr.e_ident[EI_CLASS] != ELF_CLASS) {
  311. die("Not a %d bit executable\n", ELF_BITS);
  312. }
  313. if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB) {
  314. die("Not a LSB ELF executable\n");
  315. }
  316. if (ehdr.e_ident[EI_VERSION] != EV_CURRENT) {
  317. die("Unknown ELF version\n");
  318. }
  319. /* Convert the fields to native endian */
  320. ehdr.e_type = elf_half_to_cpu(ehdr.e_type);
  321. ehdr.e_machine = elf_half_to_cpu(ehdr.e_machine);
  322. ehdr.e_version = elf_word_to_cpu(ehdr.e_version);
  323. ehdr.e_entry = elf_addr_to_cpu(ehdr.e_entry);
  324. ehdr.e_phoff = elf_off_to_cpu(ehdr.e_phoff);
  325. ehdr.e_shoff = elf_off_to_cpu(ehdr.e_shoff);
  326. ehdr.e_flags = elf_word_to_cpu(ehdr.e_flags);
  327. ehdr.e_ehsize = elf_half_to_cpu(ehdr.e_ehsize);
  328. ehdr.e_phentsize = elf_half_to_cpu(ehdr.e_phentsize);
  329. ehdr.e_phnum = elf_half_to_cpu(ehdr.e_phnum);
  330. ehdr.e_shentsize = elf_half_to_cpu(ehdr.e_shentsize);
  331. ehdr.e_shnum = elf_half_to_cpu(ehdr.e_shnum);
  332. ehdr.e_shstrndx = elf_half_to_cpu(ehdr.e_shstrndx);
  333. if ((ehdr.e_type != ET_EXEC) && (ehdr.e_type != ET_DYN)) {
  334. die("Unsupported ELF header type\n");
  335. }
  336. if (ehdr.e_machine != ELF_MACHINE) {
  337. die("Not for %s\n", ELF_MACHINE_NAME);
  338. }
  339. if (ehdr.e_version != EV_CURRENT) {
  340. die("Unknown ELF version\n");
  341. }
  342. if (ehdr.e_ehsize != sizeof(Elf_Ehdr)) {
  343. die("Bad Elf header size\n");
  344. }
  345. if (ehdr.e_phentsize != sizeof(Elf_Phdr)) {
  346. die("Bad program header entry\n");
  347. }
  348. if (ehdr.e_shentsize != sizeof(Elf_Shdr)) {
  349. die("Bad section header entry\n");
  350. }
  351. if (ehdr.e_shstrndx >= ehdr.e_shnum) {
  352. die("String table index out of bounds\n");
  353. }
  354. }
  355. static void read_shdrs(FILE *fp)
  356. {
  357. int i;
  358. Elf_Shdr shdr;
  359. secs = calloc(ehdr.e_shnum, sizeof(struct section));
  360. if (!secs) {
  361. die("Unable to allocate %d section headers\n",
  362. ehdr.e_shnum);
  363. }
  364. if (fseek(fp, ehdr.e_shoff, SEEK_SET) < 0) {
  365. die("Seek to %d failed: %s\n",
  366. ehdr.e_shoff, strerror(errno));
  367. }
  368. for (i = 0; i < ehdr.e_shnum; i++) {
  369. struct section *sec = &secs[i];
  370. if (fread(&shdr, sizeof(shdr), 1, fp) != 1)
  371. die("Cannot read ELF section headers %d/%d: %s\n",
  372. i, ehdr.e_shnum, strerror(errno));
  373. sec->shdr.sh_name = elf_word_to_cpu(shdr.sh_name);
  374. sec->shdr.sh_type = elf_word_to_cpu(shdr.sh_type);
  375. sec->shdr.sh_flags = elf_xword_to_cpu(shdr.sh_flags);
  376. sec->shdr.sh_addr = elf_addr_to_cpu(shdr.sh_addr);
  377. sec->shdr.sh_offset = elf_off_to_cpu(shdr.sh_offset);
  378. sec->shdr.sh_size = elf_xword_to_cpu(shdr.sh_size);
  379. sec->shdr.sh_link = elf_word_to_cpu(shdr.sh_link);
  380. sec->shdr.sh_info = elf_word_to_cpu(shdr.sh_info);
  381. sec->shdr.sh_addralign = elf_xword_to_cpu(shdr.sh_addralign);
  382. sec->shdr.sh_entsize = elf_xword_to_cpu(shdr.sh_entsize);
  383. if (sec->shdr.sh_link < ehdr.e_shnum)
  384. sec->link = &secs[sec->shdr.sh_link];
  385. }
  386. }
  387. static void read_strtabs(FILE *fp)
  388. {
  389. int i;
  390. for (i = 0; i < ehdr.e_shnum; i++) {
  391. struct section *sec = &secs[i];
  392. if (sec->shdr.sh_type != SHT_STRTAB) {
  393. continue;
  394. }
  395. sec->strtab = malloc(sec->shdr.sh_size);
  396. if (!sec->strtab) {
  397. die("malloc of %d bytes for strtab failed\n",
  398. sec->shdr.sh_size);
  399. }
  400. if (fseek(fp, sec->shdr.sh_offset, SEEK_SET) < 0) {
  401. die("Seek to %d failed: %s\n",
  402. sec->shdr.sh_offset, strerror(errno));
  403. }
  404. if (fread(sec->strtab, 1, sec->shdr.sh_size, fp)
  405. != sec->shdr.sh_size) {
  406. die("Cannot read symbol table: %s\n",
  407. strerror(errno));
  408. }
  409. }
  410. }
  411. static void read_symtabs(FILE *fp)
  412. {
  413. int i,j;
  414. for (i = 0; i < ehdr.e_shnum; i++) {
  415. struct section *sec = &secs[i];
  416. if (sec->shdr.sh_type != SHT_SYMTAB) {
  417. continue;
  418. }
  419. sec->symtab = malloc(sec->shdr.sh_size);
  420. if (!sec->symtab) {
  421. die("malloc of %d bytes for symtab failed\n",
  422. sec->shdr.sh_size);
  423. }
  424. if (fseek(fp, sec->shdr.sh_offset, SEEK_SET) < 0) {
  425. die("Seek to %d failed: %s\n",
  426. sec->shdr.sh_offset, strerror(errno));
  427. }
  428. if (fread(sec->symtab, 1, sec->shdr.sh_size, fp)
  429. != sec->shdr.sh_size) {
  430. die("Cannot read symbol table: %s\n",
  431. strerror(errno));
  432. }
  433. for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Sym); j++) {
  434. Elf_Sym *sym = &sec->symtab[j];
  435. sym->st_name = elf_word_to_cpu(sym->st_name);
  436. sym->st_value = elf_addr_to_cpu(sym->st_value);
  437. sym->st_size = elf_xword_to_cpu(sym->st_size);
  438. sym->st_shndx = elf_half_to_cpu(sym->st_shndx);
  439. }
  440. }
  441. }
  442. static void read_relocs(FILE *fp)
  443. {
  444. int i,j;
  445. for (i = 0; i < ehdr.e_shnum; i++) {
  446. struct section *sec = &secs[i];
  447. if (sec->shdr.sh_type != SHT_REL_TYPE) {
  448. continue;
  449. }
  450. sec->reltab = malloc(sec->shdr.sh_size);
  451. if (!sec->reltab) {
  452. die("malloc of %d bytes for relocs failed\n",
  453. sec->shdr.sh_size);
  454. }
  455. if (fseek(fp, sec->shdr.sh_offset, SEEK_SET) < 0) {
  456. die("Seek to %d failed: %s\n",
  457. sec->shdr.sh_offset, strerror(errno));
  458. }
  459. if (fread(sec->reltab, 1, sec->shdr.sh_size, fp)
  460. != sec->shdr.sh_size) {
  461. die("Cannot read symbol table: %s\n",
  462. strerror(errno));
  463. }
  464. for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) {
  465. Elf_Rel *rel = &sec->reltab[j];
  466. rel->r_offset = elf_addr_to_cpu(rel->r_offset);
  467. rel->r_info = elf_xword_to_cpu(rel->r_info);
  468. #if (SHT_REL_TYPE == SHT_RELA)
  469. rel->r_addend = elf_xword_to_cpu(rel->r_addend);
  470. #endif
  471. }
  472. }
  473. }
  474. static void print_absolute_symbols(void)
  475. {
  476. int i;
  477. const char *format;
  478. if (ELF_BITS == 64)
  479. format = "%5d %016"PRIx64" %5"PRId64" %10s %10s %12s %s\n";
  480. else
  481. format = "%5d %08"PRIx32" %5"PRId32" %10s %10s %12s %s\n";
  482. printf("Absolute symbols\n");
  483. printf(" Num: Value Size Type Bind Visibility Name\n");
  484. for (i = 0; i < ehdr.e_shnum; i++) {
  485. struct section *sec = &secs[i];
  486. char *sym_strtab;
  487. int j;
  488. if (sec->shdr.sh_type != SHT_SYMTAB) {
  489. continue;
  490. }
  491. sym_strtab = sec->link->strtab;
  492. for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Sym); j++) {
  493. Elf_Sym *sym;
  494. const char *name;
  495. sym = &sec->symtab[j];
  496. name = sym_name(sym_strtab, sym);
  497. if (sym->st_shndx != SHN_ABS) {
  498. continue;
  499. }
  500. printf(format,
  501. j, sym->st_value, sym->st_size,
  502. sym_type(ELF_ST_TYPE(sym->st_info)),
  503. sym_bind(ELF_ST_BIND(sym->st_info)),
  504. sym_visibility(ELF_ST_VISIBILITY(sym->st_other)),
  505. name);
  506. }
  507. }
  508. printf("\n");
  509. }
  510. static void print_absolute_relocs(void)
  511. {
  512. int i, printed = 0;
  513. const char *format;
  514. if (ELF_BITS == 64)
  515. format = "%016"PRIx64" %016"PRIx64" %10s %016"PRIx64" %s\n";
  516. else
  517. format = "%08"PRIx32" %08"PRIx32" %10s %08"PRIx32" %s\n";
  518. for (i = 0; i < ehdr.e_shnum; i++) {
  519. struct section *sec = &secs[i];
  520. struct section *sec_applies, *sec_symtab;
  521. char *sym_strtab;
  522. Elf_Sym *sh_symtab;
  523. int j;
  524. if (sec->shdr.sh_type != SHT_REL_TYPE) {
  525. continue;
  526. }
  527. sec_symtab = sec->link;
  528. sec_applies = &secs[sec->shdr.sh_info];
  529. if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) {
  530. continue;
  531. }
  532. sh_symtab = sec_symtab->symtab;
  533. sym_strtab = sec_symtab->link->strtab;
  534. for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) {
  535. Elf_Rel *rel;
  536. Elf_Sym *sym;
  537. const char *name;
  538. rel = &sec->reltab[j];
  539. sym = &sh_symtab[ELF_R_SYM(rel->r_info)];
  540. name = sym_name(sym_strtab, sym);
  541. if (sym->st_shndx != SHN_ABS) {
  542. continue;
  543. }
  544. /* Absolute symbols are not relocated if bzImage is
  545. * loaded at a non-compiled address. Display a warning
  546. * to user at compile time about the absolute
  547. * relocations present.
  548. *
  549. * User need to audit the code to make sure
  550. * some symbols which should have been section
  551. * relative have not become absolute because of some
  552. * linker optimization or wrong programming usage.
  553. *
  554. * Before warning check if this absolute symbol
  555. * relocation is harmless.
  556. */
  557. if (is_reloc(S_ABS, name) || is_reloc(S_REL, name))
  558. continue;
  559. if (!printed) {
  560. printf("WARNING: Absolute relocations"
  561. " present\n");
  562. printf("Offset Info Type Sym.Value "
  563. "Sym.Name\n");
  564. printed = 1;
  565. }
  566. printf(format,
  567. rel->r_offset,
  568. rel->r_info,
  569. rel_type(ELF_R_TYPE(rel->r_info)),
  570. sym->st_value,
  571. name);
  572. }
  573. }
  574. if (printed)
  575. printf("\n");
  576. }
  577. static void add_reloc(struct relocs *r, uint32_t offset)
  578. {
  579. if (r->count == r->size) {
  580. unsigned long newsize = r->size + 50000;
  581. void *mem = realloc(r->offset, newsize * sizeof(r->offset[0]));
  582. if (!mem)
  583. die("realloc of %ld entries for relocs failed\n",
  584. newsize);
  585. r->offset = mem;
  586. r->size = newsize;
  587. }
  588. r->offset[r->count++] = offset;
  589. }
  590. static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel,
  591. Elf_Sym *sym, const char *symname))
  592. {
  593. int i;
  594. /* Walk through the relocations */
  595. for (i = 0; i < ehdr.e_shnum; i++) {
  596. char *sym_strtab;
  597. Elf_Sym *sh_symtab;
  598. struct section *sec_applies, *sec_symtab;
  599. int j;
  600. struct section *sec = &secs[i];
  601. if (sec->shdr.sh_type != SHT_REL_TYPE) {
  602. continue;
  603. }
  604. sec_symtab = sec->link;
  605. sec_applies = &secs[sec->shdr.sh_info];
  606. if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) {
  607. continue;
  608. }
  609. sh_symtab = sec_symtab->symtab;
  610. sym_strtab = sec_symtab->link->strtab;
  611. for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) {
  612. Elf_Rel *rel = &sec->reltab[j];
  613. Elf_Sym *sym = &sh_symtab[ELF_R_SYM(rel->r_info)];
  614. const char *symname = sym_name(sym_strtab, sym);
  615. process(sec, rel, sym, symname);
  616. }
  617. }
  618. }
  619. /*
  620. * The .data..percpu section is a special case for x86_64 SMP kernels.
  621. * It is used to initialize the actual per_cpu areas and to provide
  622. * definitions for the per_cpu variables that correspond to their offsets
  623. * within the percpu area. Since the values of all of the symbols need
  624. * to be offsets from the start of the per_cpu area the virtual address
  625. * (sh_addr) of .data..percpu is 0 in SMP kernels.
  626. *
  627. * This means that:
  628. *
  629. * Relocations that reference symbols in the per_cpu area do not
  630. * need further relocation (since the value is an offset relative
  631. * to the start of the per_cpu area that does not change).
  632. *
  633. * Relocations that apply to the per_cpu area need to have their
  634. * offset adjusted by by the value of __per_cpu_load to make them
  635. * point to the correct place in the loaded image (because the
  636. * virtual address of .data..percpu is 0).
  637. *
  638. * For non SMP kernels .data..percpu is linked as part of the normal
  639. * kernel data and does not require special treatment.
  640. *
  641. */
  642. static int per_cpu_shndx = -1;
  643. static Elf_Addr per_cpu_load_addr;
  644. static void percpu_init(void)
  645. {
  646. int i;
  647. for (i = 0; i < ehdr.e_shnum; i++) {
  648. ElfW(Sym) *sym;
  649. if (strcmp(sec_name(i), ".data..percpu"))
  650. continue;
  651. if (secs[i].shdr.sh_addr != 0) /* non SMP kernel */
  652. return;
  653. sym = sym_lookup("__per_cpu_load");
  654. if (!sym)
  655. die("can't find __per_cpu_load\n");
  656. per_cpu_shndx = i;
  657. per_cpu_load_addr = sym->st_value;
  658. return;
  659. }
  660. }
  661. #if ELF_BITS == 64
  662. /*
  663. * Check to see if a symbol lies in the .data..percpu section.
  664. *
  665. * The linker incorrectly associates some symbols with the
  666. * .data..percpu section so we also need to check the symbol
  667. * name to make sure that we classify the symbol correctly.
  668. *
  669. * The GNU linker incorrectly associates:
  670. * __init_begin
  671. * __per_cpu_load
  672. *
  673. * The "gold" linker incorrectly associates:
  674. * init_per_cpu__irq_stack_union
  675. * init_per_cpu__gdt_page
  676. */
  677. static int is_percpu_sym(ElfW(Sym) *sym, const char *symname)
  678. {
  679. return (sym->st_shndx == per_cpu_shndx) &&
  680. strcmp(symname, "__init_begin") &&
  681. strcmp(symname, "__per_cpu_load") &&
  682. strncmp(symname, "init_per_cpu_", 13);
  683. }
  684. static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
  685. const char *symname)
  686. {
  687. unsigned r_type = ELF64_R_TYPE(rel->r_info);
  688. ElfW(Addr) offset = rel->r_offset;
  689. int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname);
  690. if (sym->st_shndx == SHN_UNDEF)
  691. return 0;
  692. /*
  693. * Adjust the offset if this reloc applies to the percpu section.
  694. */
  695. if (sec->shdr.sh_info == per_cpu_shndx)
  696. offset += per_cpu_load_addr;
  697. switch (r_type) {
  698. case R_X86_64_NONE:
  699. /* NONE can be ignored. */
  700. break;
  701. case R_X86_64_PC32:
  702. case R_X86_64_PLT32:
  703. /*
  704. * PC relative relocations don't need to be adjusted unless
  705. * referencing a percpu symbol.
  706. *
  707. * NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32.
  708. */
  709. if (is_percpu_sym(sym, symname))
  710. add_reloc(&relocs32neg, offset);
  711. break;
  712. case R_X86_64_PC64:
  713. /*
  714. * Only used by jump labels
  715. */
  716. if (is_percpu_sym(sym, symname))
  717. die("Invalid R_X86_64_PC64 relocation against per-CPU symbol %s\n",
  718. symname);
  719. break;
  720. case R_X86_64_32:
  721. case R_X86_64_32S:
  722. case R_X86_64_64:
  723. /*
  724. * References to the percpu area don't need to be adjusted.
  725. */
  726. if (is_percpu_sym(sym, symname))
  727. break;
  728. if (shn_abs) {
  729. /*
  730. * Whitelisted absolute symbols do not require
  731. * relocation.
  732. */
  733. if (is_reloc(S_ABS, symname))
  734. break;
  735. die("Invalid absolute %s relocation: %s\n",
  736. rel_type(r_type), symname);
  737. break;
  738. }
  739. /*
  740. * Relocation offsets for 64 bit kernels are output
  741. * as 32 bits and sign extended back to 64 bits when
  742. * the relocations are processed.
  743. * Make sure that the offset will fit.
  744. */
  745. if ((int32_t)offset != (int64_t)offset)
  746. die("Relocation offset doesn't fit in 32 bits\n");
  747. if (r_type == R_X86_64_64)
  748. add_reloc(&relocs64, offset);
  749. else
  750. add_reloc(&relocs32, offset);
  751. break;
  752. default:
  753. die("Unsupported relocation type: %s (%d)\n",
  754. rel_type(r_type), r_type);
  755. break;
  756. }
  757. return 0;
  758. }
  759. #else
  760. static int do_reloc32(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,
  761. const char *symname)
  762. {
  763. unsigned r_type = ELF32_R_TYPE(rel->r_info);
  764. int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname);
  765. switch (r_type) {
  766. case R_386_NONE:
  767. case R_386_PC32:
  768. case R_386_PC16:
  769. case R_386_PC8:
  770. /*
  771. * NONE can be ignored and PC relative relocations don't
  772. * need to be adjusted.
  773. */
  774. break;
  775. case R_386_32:
  776. if (shn_abs) {
  777. /*
  778. * Whitelisted absolute symbols do not require
  779. * relocation.
  780. */
  781. if (is_reloc(S_ABS, symname))
  782. break;
  783. die("Invalid absolute %s relocation: %s\n",
  784. rel_type(r_type), symname);
  785. break;
  786. }
  787. add_reloc(&relocs32, rel->r_offset);
  788. break;
  789. default:
  790. die("Unsupported relocation type: %s (%d)\n",
  791. rel_type(r_type), r_type);
  792. break;
  793. }
  794. return 0;
  795. }
  796. static int do_reloc_real(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,
  797. const char *symname)
  798. {
  799. unsigned r_type = ELF32_R_TYPE(rel->r_info);
  800. int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname);
  801. switch (r_type) {
  802. case R_386_NONE:
  803. case R_386_PC32:
  804. case R_386_PC16:
  805. case R_386_PC8:
  806. /*
  807. * NONE can be ignored and PC relative relocations don't
  808. * need to be adjusted.
  809. */
  810. break;
  811. case R_386_16:
  812. if (shn_abs) {
  813. /*
  814. * Whitelisted absolute symbols do not require
  815. * relocation.
  816. */
  817. if (is_reloc(S_ABS, symname))
  818. break;
  819. if (is_reloc(S_SEG, symname)) {
  820. add_reloc(&relocs16, rel->r_offset);
  821. break;
  822. }
  823. } else {
  824. if (!is_reloc(S_LIN, symname))
  825. break;
  826. }
  827. die("Invalid %s %s relocation: %s\n",
  828. shn_abs ? "absolute" : "relative",
  829. rel_type(r_type), symname);
  830. break;
  831. case R_386_32:
  832. if (shn_abs) {
  833. /*
  834. * Whitelisted absolute symbols do not require
  835. * relocation.
  836. */
  837. if (is_reloc(S_ABS, symname))
  838. break;
  839. if (is_reloc(S_REL, symname)) {
  840. add_reloc(&relocs32, rel->r_offset);
  841. break;
  842. }
  843. } else {
  844. if (is_reloc(S_LIN, symname))
  845. add_reloc(&relocs32, rel->r_offset);
  846. break;
  847. }
  848. die("Invalid %s %s relocation: %s\n",
  849. shn_abs ? "absolute" : "relative",
  850. rel_type(r_type), symname);
  851. break;
  852. default:
  853. die("Unsupported relocation type: %s (%d)\n",
  854. rel_type(r_type), r_type);
  855. break;
  856. }
  857. return 0;
  858. }
  859. #endif
  860. static int cmp_relocs(const void *va, const void *vb)
  861. {
  862. const uint32_t *a, *b;
  863. a = va; b = vb;
  864. return (*a == *b)? 0 : (*a > *b)? 1 : -1;
  865. }
  866. static void sort_relocs(struct relocs *r)
  867. {
  868. qsort(r->offset, r->count, sizeof(r->offset[0]), cmp_relocs);
  869. }
  870. static int write32(uint32_t v, FILE *f)
  871. {
  872. unsigned char buf[4];
  873. put_unaligned_le32(v, buf);
  874. return fwrite(buf, 1, 4, f) == 4 ? 0 : -1;
  875. }
  876. static int write32_as_text(uint32_t v, FILE *f)
  877. {
  878. return fprintf(f, "\t.long 0x%08"PRIx32"\n", v) > 0 ? 0 : -1;
  879. }
  880. static void emit_relocs(int as_text, int use_real_mode)
  881. {
  882. int i;
  883. int (*write_reloc)(uint32_t, FILE *) = write32;
  884. int (*do_reloc)(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,
  885. const char *symname);
  886. #if ELF_BITS == 64
  887. if (!use_real_mode)
  888. do_reloc = do_reloc64;
  889. else
  890. die("--realmode not valid for a 64-bit ELF file");
  891. #else
  892. if (!use_real_mode)
  893. do_reloc = do_reloc32;
  894. else
  895. do_reloc = do_reloc_real;
  896. #endif
  897. /* Collect up the relocations */
  898. walk_relocs(do_reloc);
  899. if (relocs16.count && !use_real_mode)
  900. die("Segment relocations found but --realmode not specified\n");
  901. /* Order the relocations for more efficient processing */
  902. sort_relocs(&relocs32);
  903. #if ELF_BITS == 64
  904. sort_relocs(&relocs32neg);
  905. sort_relocs(&relocs64);
  906. #else
  907. sort_relocs(&relocs16);
  908. #endif
  909. /* Print the relocations */
  910. if (as_text) {
  911. /* Print the relocations in a form suitable that
  912. * gas will like.
  913. */
  914. printf(".section \".data.reloc\",\"a\"\n");
  915. printf(".balign 4\n");
  916. write_reloc = write32_as_text;
  917. }
  918. if (use_real_mode) {
  919. write_reloc(relocs16.count, stdout);
  920. for (i = 0; i < relocs16.count; i++)
  921. write_reloc(relocs16.offset[i], stdout);
  922. write_reloc(relocs32.count, stdout);
  923. for (i = 0; i < relocs32.count; i++)
  924. write_reloc(relocs32.offset[i], stdout);
  925. } else {
  926. #if ELF_BITS == 64
  927. /* Print a stop */
  928. write_reloc(0, stdout);
  929. /* Now print each relocation */
  930. for (i = 0; i < relocs64.count; i++)
  931. write_reloc(relocs64.offset[i], stdout);
  932. /* Print a stop */
  933. write_reloc(0, stdout);
  934. /* Now print each inverse 32-bit relocation */
  935. for (i = 0; i < relocs32neg.count; i++)
  936. write_reloc(relocs32neg.offset[i], stdout);
  937. #endif
  938. /* Print a stop */
  939. write_reloc(0, stdout);
  940. /* Now print each relocation */
  941. for (i = 0; i < relocs32.count; i++)
  942. write_reloc(relocs32.offset[i], stdout);
  943. }
  944. }
  945. /*
  946. * As an aid to debugging problems with different linkers
  947. * print summary information about the relocs.
  948. * Since different linkers tend to emit the sections in
  949. * different orders we use the section names in the output.
  950. */
  951. static int do_reloc_info(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
  952. const char *symname)
  953. {
  954. printf("%s\t%s\t%s\t%s\n",
  955. sec_name(sec->shdr.sh_info),
  956. rel_type(ELF_R_TYPE(rel->r_info)),
  957. symname,
  958. sec_name(sym->st_shndx));
  959. return 0;
  960. }
  961. static void print_reloc_info(void)
  962. {
  963. printf("reloc section\treloc type\tsymbol\tsymbol section\n");
  964. walk_relocs(do_reloc_info);
  965. }
  966. #if ELF_BITS == 64
  967. # define process process_64
  968. #else
  969. # define process process_32
  970. #endif
  971. void process(FILE *fp, int use_real_mode, int as_text,
  972. int show_absolute_syms, int show_absolute_relocs,
  973. int show_reloc_info)
  974. {
  975. regex_init(use_real_mode);
  976. read_ehdr(fp);
  977. read_shdrs(fp);
  978. read_strtabs(fp);
  979. read_symtabs(fp);
  980. read_relocs(fp);
  981. if (ELF_BITS == 64)
  982. percpu_init();
  983. if (show_absolute_syms) {
  984. print_absolute_symbols();
  985. return;
  986. }
  987. if (show_absolute_relocs) {
  988. print_absolute_relocs();
  989. return;
  990. }
  991. if (show_reloc_info) {
  992. print_reloc_info();
  993. return;
  994. }
  995. emit_relocs(as_text, use_real_mode);
  996. }