From: "Mike Frysinger" <vapier@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/pax-utils:master commit in: /
Date: Sun, 22 Jan 2017 17:59:32 +0000 (UTC) [thread overview]
Message-ID: <1480055432.2eb852129394f97dae89c0ff1f9f48637edcb0e9.vapier@gentoo> (raw)
commit: 2eb852129394f97dae89c0ff1f9f48637edcb0e9
Author: Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Fri Nov 25 06:30:32 2016 +0000
Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Fri Nov 25 06:30:32 2016 +0000
URL: https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=2eb85212
scanelf: rewrite textrels decoder to use program segments
Previously, we only looked at the section name ".text". This fails when
other names are used, or when the section headers are incomplete. Since
the runtime only looks at program headers, change the code to match.
scanelf.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 88 insertions(+), 28 deletions(-)
diff --git a/scanelf.c b/scanelf.c
index 2a7c0ce..9c52ced 100644
--- a/scanelf.c
+++ b/scanelf.c
@@ -572,8 +572,8 @@ static const char *scanelf_file_textrel(elfobj *elf, char *found_textrel)
*/
static char *scanelf_file_textrels(elfobj *elf, char *found_textrels, char *found_textrel)
{
- unsigned long s, r, rmax;
- void *symtab_void, *strtab_void, *text_void;
+ unsigned long r, rmax;
+ void *symtab_void, *strtab_void;
if (!show_textrels) return NULL;
@@ -582,32 +582,87 @@ static char *scanelf_file_textrels(elfobj *elf, char *found_textrels, char *foun
if (!*found_textrel) return NULL;
scanelf_file_get_symtabs(elf, &symtab_void, &strtab_void);
- text_void = elf_findsecbyname(elf, ".text");
#define SHOW_TEXTRELS(B) \
+ size_t i; \
Elf ## B ## _Ehdr *ehdr = EHDR ## B (elf->ehdr); \
- Elf ## B ## _Shdr *shdr = SHDR ## B (elf->shdr); \
+ Elf ## B ## _Phdr *phdr; \
+ Elf ## B ## _Off offset; \
Elf ## B ## _Shdr *symtab = SHDR ## B (symtab_void); \
Elf ## B ## _Shdr *strtab = SHDR ## B (strtab_void); \
- Elf ## B ## _Shdr *text = SHDR ## B (text_void); \
- Elf ## B ## _Addr vaddr = EGET(text->sh_addr); \
- uint ## B ## _t memsz = EGET(text->sh_size); \
Elf ## B ## _Rel *rel; \
Elf ## B ## _Rela *rela; \
- /* search the section headers for relocations */ \
- for (s = 0; s < EGET(ehdr->e_shnum); ++s) { \
- uint32_t sh_type = EGET(shdr[s].sh_type); \
- if (sh_type == SHT_REL) { \
- rel = REL ## B (elf->vdata + EGET(shdr[s].sh_offset)); \
- rela = NULL; \
- rmax = EGET(shdr[s].sh_size) / sizeof(*rel); \
- } else if (sh_type == SHT_RELA) { \
- rel = NULL; \
- rela = RELA ## B (elf->vdata + EGET(shdr[s].sh_offset)); \
- rmax = EGET(shdr[s].sh_size) / sizeof(*rela); \
- } else \
+ Elf ## B ## _Dyn *dyn, *drel, *drelsz, *drelent, *dpltrel; \
+ uint32_t pltrel; \
+ \
+ /* Find the dynamic headers */ \
+ phdr = scanelf_file_get_pt_dynamic(elf); \
+ if (phdr == NULL) \
+ break; \
+ offset = EGET(phdr->p_offset); \
+ \
+ /* Walk all the dynamic tags to find relocation info */ \
+ dyn = DYN ## B (elf->vdata + offset); \
+ drel = drelsz = drelent = dpltrel = NULL; \
+ while (EGET(dyn->d_tag) != DT_NULL) { \
+ switch (EGET(dyn->d_tag)) { \
+ case DT_REL: \
+ case DT_RELA: \
+ drel = dyn; \
+ break; \
+ case DT_RELSZ: \
+ case DT_RELASZ: \
+ drelsz = dyn; \
+ break; \
+ case DT_RELENT: \
+ case DT_RELAENT: \
+ drelent = dyn; \
+ break; \
+ case DT_PLTREL: \
+ dpltrel = dyn; \
+ break; \
+ } \
+ ++dyn; \
+ } \
+ if (!drel || !drelsz || !drelent || !dpltrel) { \
+ warnf("ELF is missing relocation information"); \
+ break; \
+ } \
+ switch (EGET(dpltrel->d_un.d_val)) { \
+ case DT_REL: \
+ rel = REL##B(elf->vdata + EGET(drel->d_un.d_val)); \
+ rela = NULL; \
+ pltrel = DT_REL; \
+ break; \
+ case DT_RELA: \
+ rel = NULL; \
+ rela = RELA##B(elf->vdata + EGET(drel->d_un.d_val)); \
+ pltrel = DT_RELA; \
+ break; \
+ default: \
+ warn("Unknown relocation type"); \
+ rel = NULL; \
+ rela = NULL; \
+ break; \
+ } \
+ if (!rel && !rela) \
+ break; \
+ rmax = EGET(drelsz->d_un.d_val) / EGET(drelent->d_un.d_val); \
+ \
+ /* search the program segments for relocations */ \
+ phdr = PHDR ## B(elf->phdr); \
+ for (i = 0; i < EGET(ehdr->e_phnum); ++i) { \
+ Elf ## B ## _Addr vaddr = EGET(phdr[i].p_vaddr); \
+ uint ## B ## _t memsz = EGET(phdr[i].p_memsz); \
+ \
+ /* Only care about loadable segments. */ \
+ if (EGET(phdr[i].p_type) != PT_LOAD) \
continue; \
- /* now see if any of the relocs are in the .text */ \
+ /* Only care about executable segments. */ \
+ if ((EGET(phdr[i].p_flags) & PF_X) != PF_X) \
+ continue; \
+ \
+ /* now see if any of the relocs touch this segment */ \
for (r = 0; r < rmax; ++r) { \
unsigned long sym_max; \
Elf ## B ## _Addr offset_tmp; \
@@ -615,7 +670,7 @@ static char *scanelf_file_textrels(elfobj *elf, char *found_textrels, char *foun
Elf ## B ## _Sym *sym; \
Elf ## B ## _Addr r_offset; \
uint ## B ## _t r_info; \
- if (sh_type == SHT_REL) { \
+ if (pltrel == DT_REL) { \
r_offset = EGET(rel[r].r_offset); \
r_info = EGET(rel[r].r_info); \
} else { \
@@ -641,7 +696,9 @@ static char *scanelf_file_textrels(elfobj *elf, char *found_textrels, char *foun
sym_max = EGET(symtab->sh_size) / EGET(symtab->sh_entsize); \
/* show the raw details about this reloc */ \
printf(" %s: ", elf->base_filename); \
- if (sym && sym->st_name) \
+ if (!strtab) \
+ printf("(missing symbols)"); \
+ else if (sym && sym->st_name) \
printf("%s", elf->data + EGET(strtab->sh_offset) + EGET(sym->st_name)); \
else \
printf("(memory/data?)"); \
@@ -659,11 +716,14 @@ static char *scanelf_file_textrels(elfobj *elf, char *found_textrels, char *foun
} \
printf(" in "); \
if (func && func->st_name) { \
- const char *func_name = elf->data + EGET(strtab->sh_offset) + EGET(func->st_name); \
- if (r_offset > EGET(func->st_size)) \
- printf("(optimized out: previous %s)", func_name); \
- else \
- printf("%s", func_name); \
+ if (strtab) { \
+ const char *func_name = elf->data + EGET(strtab->sh_offset) + EGET(func->st_name); \
+ if (r_offset > EGET(func->st_size)) \
+ printf("(optimized out: previous %s)", func_name); \
+ else \
+ printf("%s", func_name); \
+ } else \
+ printf("(missing symbols)"); \
} else \
printf("(optimized out)"); \
printf(" [0x%lX]\n", (unsigned long)offset_tmp); \
@@ -690,7 +750,7 @@ static char *scanelf_file_textrels(elfobj *elf, char *found_textrels, char *foun
} \
} \
}
- if (symtab_void && strtab_void && text_void && elf->shdr)
+ if (symtab_void && elf->phdr)
SCANELF_ELF_SIZED(SHOW_TEXTRELS);
if (!*found_textrels)
warnf("ELF %s has TEXTREL markings but doesnt appear to have any real TEXTREL's !?", elf->filename);
next reply other threads:[~2017-01-22 17:59 UTC|newest]
Thread overview: 253+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-22 17:59 Mike Frysinger [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-09-22 4:33 [gentoo-commits] proj/pax-utils:master commit in: / Sam James
2024-09-22 4:30 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:02 Sam James
2024-07-22 21:07 Mike Gilbert
2024-07-22 20:08 Mike Gilbert
2024-01-25 6:52 Mike Frysinger
2024-01-25 5:57 Mike Frysinger
2024-01-25 5:57 Mike Frysinger
2024-01-25 5:36 Mike Frysinger
2024-01-25 5:21 Mike Frysinger
2024-01-25 5:06 Mike Frysinger
2024-01-25 5:06 Mike Frysinger
2024-01-25 4:44 Mike Frysinger
2024-01-25 2:53 Mike Frysinger
2024-01-25 2:53 Mike Frysinger
2024-01-25 2:53 Mike Frysinger
2024-01-25 2:14 Mike Frysinger
2024-01-24 22:53 Mike Frysinger
2024-01-24 22:15 Mike Frysinger
2024-01-24 15:44 Mike Frysinger
2024-01-16 5:13 Mike Frysinger
2024-01-16 5:13 Mike Frysinger
2024-01-10 8:05 Mike Frysinger
2024-01-10 8:02 Mike Frysinger
2024-01-10 8:02 Mike Frysinger
2024-01-10 7:58 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 16:28 Mike Frysinger
2024-01-01 15:43 Mike Frysinger
2024-01-01 15:43 Mike Frysinger
2023-12-22 5:31 Mike Frysinger
2023-12-22 5:31 Mike Frysinger
2023-12-22 5:31 Mike Frysinger
2023-12-22 2:31 Mike Frysinger
2023-12-22 2:31 Mike Frysinger
2023-12-22 2:31 Mike Frysinger
2023-12-14 21:28 Mike Frysinger
2023-12-14 21:28 Mike Frysinger
2023-12-14 19:57 Mike Frysinger
2023-11-23 13:31 Sam James
2023-02-13 5:26 Sam James
2023-02-13 5:26 Sam James
2023-01-29 5:56 Sam James
2023-01-29 5:56 Sam James
2023-01-29 5:56 Sam James
2023-01-29 3:41 Sam James
2023-01-29 3:36 Sam James
2023-01-29 3:36 Sam James
2023-01-26 21:46 Sam James
2023-01-06 7:15 Sam James
2022-09-28 7:42 Mike Frysinger
2022-09-28 7:42 Mike Frysinger
2022-09-28 7:42 Mike Frysinger
2022-09-28 7:42 Mike Frysinger
2022-09-28 7:42 Mike Frysinger
2022-09-28 7:42 Mike Frysinger
2022-09-28 7:42 Mike Frysinger
2022-09-21 8:28 Mike Frysinger
2022-09-21 8:26 Mike Frysinger
2022-09-21 8:20 Mike Frysinger
2022-07-31 4:56 Sam James
2022-07-12 6:33 Sam James
2022-07-12 6:33 Sam James
2022-04-25 1:20 WANG Xuerui
2022-03-24 15:42 Sam James
2022-03-09 8:01 Mike Frysinger
2022-02-07 7:18 Fabian Groffen
2022-01-23 2:47 Mike Frysinger
2021-12-24 1:45 Sam James
2021-12-17 5:19 Mike Frysinger
2021-10-17 5:15 Mike Frysinger
2021-10-05 1:05 Mike Frysinger
2021-10-04 22:05 Mike Frysinger
2021-09-20 4:51 Sam James
2021-07-22 21:31 Sergei Trofimovich
2021-07-22 21:16 Sergei Trofimovich
2021-07-02 22:04 Sergei Trofimovich
2021-06-10 7:07 Sergei Trofimovich
2021-06-10 7:02 Sergei Trofimovich
2021-04-19 4:58 Mike Frysinger
2021-04-18 18:29 Mike Frysinger
2021-04-17 5:39 Mike Frysinger
2021-04-17 5:39 Mike Frysinger
2021-04-17 0:38 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:03 Mike Frysinger
2021-04-16 19:03 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16 3:41 Mike Frysinger
2021-04-16 3:39 Mike Frysinger
2021-04-16 3:39 Mike Frysinger
2021-04-16 1:56 Mike Frysinger
2021-04-16 1:56 Mike Frysinger
2021-04-16 0:48 Mike Frysinger
2021-04-16 0:48 Mike Frysinger
2021-02-26 11:51 Sergei Trofimovich
2021-02-04 18:51 Sergei Trofimovich
2021-02-03 20:41 Sergei Trofimovich
2021-02-03 20:17 Sergei Trofimovich
2021-02-03 19:46 Sergei Trofimovich
2021-01-01 14:08 Fabian Groffen
2021-01-01 14:08 Fabian Groffen
2020-12-20 19:53 Sergei Trofimovich
2020-10-05 17:46 Sergei Trofimovich
2020-08-14 22:17 Sergei Trofimovich
2020-04-13 10:41 Sergei Trofimovich
2020-04-06 18:00 Sergei Trofimovich
2020-03-26 19:27 Mike Frysinger
2020-03-26 17:09 Mike Frysinger
2020-03-26 17:09 Mike Frysinger
2020-03-19 0:00 Sergei Trofimovich
2020-03-18 23:39 Sergei Trofimovich
2020-02-16 10:57 Sergei Trofimovich
2020-02-16 10:50 Sergei Trofimovich
2020-02-16 10:48 Sergei Trofimovich
2020-02-16 10:17 Sergei Trofimovich
2019-01-14 22:53 Sergei Trofimovich
2018-11-19 22:20 Sergei Trofimovich
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 4:44 Mike Frysinger
2018-06-07 4:44 Mike Frysinger
2018-06-07 4:44 Mike Frysinger
2018-02-24 10:16 Sergei Trofimovich
2017-09-18 9:27 Fabian Groffen
2017-09-18 9:27 Fabian Groffen
2017-09-18 7:06 Fabian Groffen
2017-03-14 7:19 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-11 7:06 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-01-24 20:39 Mike Frysinger
2017-01-24 20:39 Mike Frysinger
2017-01-24 6:50 Mike Frysinger
2017-01-24 6:50 Mike Frysinger
2017-01-24 6:50 Mike Frysinger
2017-01-24 6:50 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2016-11-27 3:43 Mike Frysinger
2016-11-15 4:02 Mike Frysinger
2016-11-15 4:02 Mike Frysinger
2016-11-14 14:57 Mike Frysinger
2016-11-12 7:15 Mike Frysinger
2016-11-12 7:15 Mike Frysinger
2016-11-12 7:15 Mike Frysinger
2016-11-12 7:15 Mike Frysinger
2016-11-12 7:15 Mike Frysinger
2016-11-12 7:15 Mike Frysinger
2016-11-08 20:47 Mike Gilbert
2016-06-20 17:46 Mike Frysinger
2016-06-20 4:03 Mike Frysinger
2016-06-20 4:03 Mike Frysinger
2016-06-20 3:22 Mike Frysinger
2016-06-20 3:22 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-06-20 3:08 Mike Frysinger
2016-05-31 22:27 Mike Frysinger
2016-03-03 21:15 Mike Frysinger
2016-02-10 19:41 Mike Frysinger
2016-02-10 18:54 Mike Frysinger
2016-01-28 22:42 Mike Frysinger
2016-01-03 22:23 Mike Frysinger
2016-01-03 22:23 Mike Frysinger
2016-01-03 22:01 Mike Frysinger
2016-01-02 15:26 Mike Frysinger
2016-01-02 3:52 Mike Frysinger
2015-12-19 19:41 Mike Frysinger
2015-12-17 3:24 Mike Frysinger
2015-12-17 3:24 Mike Frysinger
2015-12-17 3:24 Mike Frysinger
2015-12-17 3:24 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-11-26 8:43 Mike Frysinger
2015-10-26 4:35 Mike Frysinger
2015-10-08 20:31 Mike Frysinger
2015-09-19 6:27 Mike Frysinger
2015-09-19 6:27 Mike Frysinger
2015-09-12 4:17 Mike Frysinger
2015-08-28 0:33 Mike Frysinger
2015-08-26 6:29 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:33 Mike Frysinger
2015-08-20 14:33 Mike Frysinger
2015-08-20 13:32 Mike Frysinger
2015-08-18 15:56 Mike Frysinger
2015-08-18 15:35 Mike Frysinger
2015-08-18 15:35 Mike Frysinger
2015-08-18 14:39 Mike Frysinger
2015-08-18 14:38 Mike Frysinger
2015-07-13 9:14 Mike Frysinger
2015-07-13 9:14 Mike Frysinger
2015-07-13 9:14 Mike Frysinger
2015-05-24 3:22 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-10 5:31 Mike Frysinger
2015-03-10 5:31 Mike Frysinger
2015-03-10 4:19 Mike Frysinger
2015-03-10 3:36 Mike Frysinger
2015-03-06 11:52 Mike Frysinger
2015-03-04 22:35 Mike Frysinger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1480055432.2eb852129394f97dae89c0ff1f9f48637edcb0e9.vapier@gentoo \
--to=vapier@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox