* [PATCH] readelf: PR28928 - wrong dynamic section entry number @ 2022-03-01 12:54 Di Chen 2022-03-22 13:47 ` Di Chen 0 siblings, 1 reply; 3+ messages in thread From: Di Chen @ 2022-03-01 12:54 UTC (permalink / raw) To: elfutils-devel commit 978663c5323cf402cd35b8614e41f24b587cbdd8 (HEAD -> dichen/DT_NULL, origin/dichen/DT_NULL) Author: Di Chen <dichen@redhat.com> Date: Tue Mar 1 20:44:38 2022 +0800 readelf: PR28928 - wrong dynamic section entry number when using `$ eu-readelf -d {file}` to get the number of dynamic section entris, It wrongly counts the padding DT_NULLs as dynamic section entries. However, DT_NULL Marks end of dynamic section. They should not be counted as dynamic section entries. https://sourceware.org/bugzilla/show_bug.cgi?id=28928 Signed-off-by: Di Chen <dichen@redhat.com> diff --git a/src/readelf.c b/src/readelf.c index 93fb5989..1bec3aa6 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_scngrp (Ebl *ebl); static void print_dynamic (Ebl *ebl); +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr); @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) [dichen@arpeggio elfutils]$ git format-patch -1 HEAD 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch [dichen@arpeggio elfutils]$ vim 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch [dichen@arpeggio elfutils]$ cat 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch From 978663c5323cf402cd35b8614e41f24b587cbdd8 Mon Sep 17 00:00:00 2001 From: Di Chen <dichen@redhat.com> Date: Tue, 1 Mar 2022 20:44:38 +0800 Subject: [PATCH] readelf: PR28928 - wrong dynamic section entry number when using `$ eu-readelf -d {file}` to get the number of dynamic section entris, It wrongly counts the padding DT_NULLs as dynamic section entries. However, DT_NULL Marks end of dynamic section. They should not be counted as dynamic section entries. https://sourceware.org/bugzilla/show_bug.cgi?id=28928 Signed-off-by: Di Chen <dichen@redhat.com> --- src/readelf.c | 49 ++++++++++++++++++++++++++++++++++++------ tests/alldts.c | 5 +++-- tests/run-alldts.sh | 2 +- tests/run-readelf-d.sh | 7 +----- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/readelf.c b/src/readelf.c index 93fb5989..1bec3aa6 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_scngrp (Ebl *ebl); static void print_dynamic (Ebl *ebl); +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr); @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) } +static GElf_Phdr * +get_dyn_phdr (Elf *elf) +{ + GElf_Phdr *phdr = NULL; + for (size_t i = 0; i < phnum; ++i) { + GElf_Phdr phdr_mem; + phdr = gelf_getphdr(elf, i, &phdr_mem); + if (phdr->p_type == PT_DYNAMIC) { + break; + } + } + return phdr; +} + + +static size_t +get_dyn_scnents (Elf *elf, GElf_Phdr * dyn_phdr) +{ + Elf_Data *data = elf_getdata_rawchunk( + elf, dyn_phdr->p_offset, dyn_phdr->p_filesz, ELF_T_DYN); + GElf_Dyn *dyn; + size_t dyn_idx = 0; + do + { + GElf_Dyn dyn_mem; + dyn = gelf_getdyn(data, dyn_idx, &dyn_mem); + ++dyn_idx; + } while (dyn->d_tag != DT_NULL); + + return dyn_idx; +} + + static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) { int class = gelf_getclass (ebl->elf); + GElf_Phdr *dyn_phdr; GElf_Shdr glink_mem; GElf_Shdr *glink; Elf_Data *data; size_t cnt; size_t shstrndx; - size_t sh_entsize; + size_t dyn_scnents; + + /* Calculate the dynamic section entry number */ + dyn_phdr = get_dyn_phdr (ebl->elf); + dyn_scnents = get_dyn_scnents (ebl->elf, dyn_phdr); /* Get the data of the section. */ data = elf_getdata (scn, NULL); @@ -1802,8 +1841,6 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) error (EXIT_FAILURE, 0, _("cannot get section header string table index")); - sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT); - glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem); if (glink == NULL) error (EXIT_FAILURE, 0, _("invalid sh_link value in section %zu"), @@ -1813,15 +1850,15 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", "\ \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", - shdr->sh_size / sh_entsize), - (unsigned long int) (shdr->sh_size / sh_entsize), + dyn_scnents), + (unsigned long int) dyn_scnents, class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, shdr->sh_offset, (int) shdr->sh_link, elf_strptr (ebl->elf, shstrndx, glink->sh_name)); fputs_unlocked (_(" Type Value\n"), stdout); - for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + for (cnt = 0; cnt < dyn_scnents; ++cnt) { GElf_Dyn dynmem; GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem); diff --git a/tests/alldts.c b/tests/alldts.c index 3e9f9fe6..d0fe4f24 100644 --- a/tests/alldts.c +++ b/tests/alldts.c @@ -44,7 +44,7 @@ main (void) Dwelf_Strent *shstrtabse; const Elf32_Sword dtflags[] = { - DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, + DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, DT_HASH, DT_STRTAB, DT_SYMTAB, DT_RELA, DT_RELASZ, DT_RELAENT, DT_STRSZ, DT_SYMENT, DT_INIT, DT_FINI, DT_SONAME, DT_RPATH, @@ -61,7 +61,8 @@ main (void) DT_GNU_LIBLIST, DT_CONFIG, DT_DEPAUDIT, DT_AUDIT, DT_PLTPAD, DT_MOVETAB, DT_SYMINFO, DT_RELACOUNT, DT_RELCOUNT, DT_FLAGS_1, DT_VERDEF, DT_VERDEFNUM, - DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER + DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER, + DT_NULL }; const int ndtflags = sizeof (dtflags) / sizeof (dtflags[0]); diff --git a/tests/run-alldts.sh b/tests/run-alldts.sh index 6a9a9ece..bd750a35 100755 --- a/tests/run-alldts.sh +++ b/tests/run-alldts.sh @@ -27,7 +27,6 @@ testrun_compare ${abs_top_builddir}/src/readelf -d testfile-alldts <<\EOF Dynamic segment contains 66 entries: Addr: 0x000001a0 Offset: 0x000078 Link to section: [ 0] '' Type Value - NULL NEEDED Shared library: [(null)] PLTRELSZ 3735928559 (bytes) PLTGOT 0xdeadbeef @@ -93,6 +92,7 @@ Dynamic segment contains 66 entries: VERNEEDNUM 3735928559 AUXILIARY 0xdeadbeef FILTER 0xdeadbeef + NULL EOF exit 0 diff --git a/tests/run-readelf-d.sh b/tests/run-readelf-d.sh index d0b6ed24..69b01c49 100755 --- a/tests/run-readelf-d.sh +++ b/tests/run-readelf-d.sh @@ -34,7 +34,7 @@ testfiles testlib_dynseg.so testrun_compare ${abs_top_builddir}/src/readelf -d testlib_dynseg.so <<\EOF -Dynamic segment contains 28 entries: +Dynamic segment contains 23 entries: Addr: 0x00000000000017e0 Offset: 0x0007e0 Link to section: [ 3] '.dynstr' Type Value PLTGOT 0x00000000000019c8 @@ -60,11 +60,6 @@ Dynamic segment contains 28 entries: VERNEED 0x0000000000000498 VERNEEDNUM 2 NULL - NULL - NULL - NULL - NULL - NULL EOF exit 0 -- 2.34.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] readelf: PR28928 - wrong dynamic section entry number 2022-03-01 12:54 [PATCH] readelf: PR28928 - wrong dynamic section entry number Di Chen @ 2022-03-22 13:47 ` Di Chen 2022-03-30 11:25 ` Di Chen 0 siblings, 1 reply; 3+ messages in thread From: Di Chen @ 2022-03-22 13:47 UTC (permalink / raw) To: elfutils-devel [-- Attachment #1: Type: text/plain, Size: 8268 bytes --] Hey team, I made some changes for this patch: (1) update the commit message to make it more clear (2) tests/alldts.c needs the padding spaces for output comparison On Tue, Mar 1, 2022 at 8:54 PM Di Chen <dichen@redhat.com> wrote: > commit 978663c5323cf402cd35b8614e41f24b587cbdd8 (HEAD -> dichen/DT_NULL, > origin/dichen/DT_NULL) > Author: Di Chen <dichen@redhat.com> > Date: Tue Mar 1 20:44:38 2022 +0800 > > readelf: PR28928 - wrong dynamic section entry number > > when using `$ eu-readelf -d {file}` to get the number of dynamic > section entris, It wrongly counts the padding DT_NULLs as dynamic > section entries. However, DT_NULL Marks end of dynamic section. > They should not be counted as dynamic section entries. > > https://sourceware.org/bugzilla/show_bug.cgi?id=28928 > > Signed-off-by: Di Chen <dichen@redhat.com> > > diff --git a/src/readelf.c b/src/readelf.c > index 93fb5989..1bec3aa6 100644 > --- a/src/readelf.c > +++ b/src/readelf.c > @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); > static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); > static void print_scngrp (Ebl *ebl); > static void print_dynamic (Ebl *ebl); > +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); > static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); > static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, > GElf_Shdr *shdr); > @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) > [dichen@arpeggio elfutils]$ git format-patch -1 HEAD > 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch > [dichen@arpeggio elfutils]$ vim > 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch > [dichen@arpeggio elfutils]$ cat > 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch > From 978663c5323cf402cd35b8614e41f24b587cbdd8 Mon Sep 17 00:00:00 2001 > From: Di Chen <dichen@redhat.com> > Date: Tue, 1 Mar 2022 20:44:38 +0800 > Subject: [PATCH] readelf: PR28928 - wrong dynamic section entry number > > when using `$ eu-readelf -d {file}` to get the number of dynamic > section entris, It wrongly counts the padding DT_NULLs as dynamic > section entries. However, DT_NULL Marks end of dynamic section. > They should not be counted as dynamic section entries. > > https://sourceware.org/bugzilla/show_bug.cgi?id=28928 > > Signed-off-by: Di Chen <dichen@redhat.com> > --- > src/readelf.c | 49 ++++++++++++++++++++++++++++++++++++------ > tests/alldts.c | 5 +++-- > tests/run-alldts.sh | 2 +- > tests/run-readelf-d.sh | 7 +----- > 4 files changed, 48 insertions(+), 15 deletions(-) > > diff --git a/src/readelf.c b/src/readelf.c > index 93fb5989..1bec3aa6 100644 > --- a/src/readelf.c > +++ b/src/readelf.c > @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); > static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); > static void print_scngrp (Ebl *ebl); > static void print_dynamic (Ebl *ebl); > +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); > static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); > static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, > GElf_Shdr *shdr); > @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) > } > > > +static GElf_Phdr * > +get_dyn_phdr (Elf *elf) > +{ > + GElf_Phdr *phdr = NULL; > + for (size_t i = 0; i < phnum; ++i) { > + GElf_Phdr phdr_mem; > + phdr = gelf_getphdr(elf, i, &phdr_mem); > + if (phdr->p_type == PT_DYNAMIC) { > + break; > + } > + } > + return phdr; > +} > + > + > +static size_t > +get_dyn_scnents (Elf *elf, GElf_Phdr * dyn_phdr) > +{ > + Elf_Data *data = elf_getdata_rawchunk( > + elf, dyn_phdr->p_offset, dyn_phdr->p_filesz, ELF_T_DYN); > + GElf_Dyn *dyn; > + size_t dyn_idx = 0; > + do > + { > + GElf_Dyn dyn_mem; > + dyn = gelf_getdyn(data, dyn_idx, &dyn_mem); > + ++dyn_idx; > + } while (dyn->d_tag != DT_NULL); > + > + return dyn_idx; > +} > + > + > static void > handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) > { > int class = gelf_getclass (ebl->elf); > + GElf_Phdr *dyn_phdr; > GElf_Shdr glink_mem; > GElf_Shdr *glink; > Elf_Data *data; > size_t cnt; > size_t shstrndx; > - size_t sh_entsize; > + size_t dyn_scnents; > + > + /* Calculate the dynamic section entry number */ > + dyn_phdr = get_dyn_phdr (ebl->elf); > + dyn_scnents = get_dyn_scnents (ebl->elf, dyn_phdr); > > /* Get the data of the section. */ > data = elf_getdata (scn, NULL); > @@ -1802,8 +1841,6 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr > *shdr) > error (EXIT_FAILURE, 0, > _("cannot get section header string table index")); > > - sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT); > - > glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem); > if (glink == NULL) > error (EXIT_FAILURE, 0, _("invalid sh_link value in section %zu"), > @@ -1813,15 +1850,15 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr > *shdr) > \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: > %#08" PRIx64 " Link to section: [%2u] '%s'\n", > "\ > \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 " Offset: > %#08" PRIx64 " Link to section: [%2u] '%s'\n", > - shdr->sh_size / sh_entsize), > - (unsigned long int) (shdr->sh_size / sh_entsize), > + dyn_scnents), > + (unsigned long int) dyn_scnents, > class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, > shdr->sh_offset, > (int) shdr->sh_link, > elf_strptr (ebl->elf, shstrndx, glink->sh_name)); > fputs_unlocked (_(" Type Value\n"), stdout); > > - for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) > + for (cnt = 0; cnt < dyn_scnents; ++cnt) > { > GElf_Dyn dynmem; > GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem); > diff --git a/tests/alldts.c b/tests/alldts.c > index 3e9f9fe6..d0fe4f24 100644 > --- a/tests/alldts.c > +++ b/tests/alldts.c > @@ -44,7 +44,7 @@ main (void) > Dwelf_Strent *shstrtabse; > const Elf32_Sword dtflags[] = > { > - DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, > + DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, > DT_HASH, DT_STRTAB, DT_SYMTAB, DT_RELA, > DT_RELASZ, DT_RELAENT, DT_STRSZ, DT_SYMENT, > DT_INIT, DT_FINI, DT_SONAME, DT_RPATH, > @@ -61,7 +61,8 @@ main (void) > DT_GNU_LIBLIST, DT_CONFIG, DT_DEPAUDIT, DT_AUDIT, > DT_PLTPAD, DT_MOVETAB, DT_SYMINFO, DT_RELACOUNT, > DT_RELCOUNT, DT_FLAGS_1, DT_VERDEF, DT_VERDEFNUM, > - DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER > + DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER, > + DT_NULL > }; > const int ndtflags = sizeof (dtflags) / sizeof (dtflags[0]); > > diff --git a/tests/run-alldts.sh b/tests/run-alldts.sh > index 6a9a9ece..bd750a35 100755 > --- a/tests/run-alldts.sh > +++ b/tests/run-alldts.sh > @@ -27,7 +27,6 @@ testrun_compare ${abs_top_builddir}/src/readelf -d > testfile-alldts <<\EOF > Dynamic segment contains 66 entries: > Addr: 0x000001a0 Offset: 0x000078 Link to section: [ 0] '' > Type Value > - NULL > NEEDED Shared library: [(null)] > PLTRELSZ 3735928559 (bytes) > PLTGOT 0xdeadbeef > @@ -93,6 +92,7 @@ Dynamic segment contains 66 entries: > VERNEEDNUM 3735928559 > AUXILIARY 0xdeadbeef > FILTER 0xdeadbeef > + NULL > EOF > > exit 0 > diff --git a/tests/run-readelf-d.sh b/tests/run-readelf-d.sh > index d0b6ed24..69b01c49 100755 > --- a/tests/run-readelf-d.sh > +++ b/tests/run-readelf-d.sh > @@ -34,7 +34,7 @@ testfiles testlib_dynseg.so > > testrun_compare ${abs_top_builddir}/src/readelf -d testlib_dynseg.so > <<\EOF > > -Dynamic segment contains 28 entries: > +Dynamic segment contains 23 entries: > Addr: 0x00000000000017e0 Offset: 0x0007e0 Link to section: [ 3] > '.dynstr' > Type Value > PLTGOT 0x00000000000019c8 > @@ -60,11 +60,6 @@ Dynamic segment contains 28 entries: > VERNEED 0x0000000000000498 > VERNEEDNUM 2 > NULL > - NULL > - NULL > - NULL > - NULL > - NULL > EOF > > exit 0 > -- > 2.34.1 > > [-- Attachment #2: 0001-readelf-Don-t-consider-padding-DT_NULL-as-dynamic-se.patch --] [-- Type: text/x-patch, Size: 6202 bytes --] From 1f0ae2c9643a0871109f53ec8506bf5697d67a70 Mon Sep 17 00:00:00 2001 From: Di Chen <dichen@redhat.com> Date: Tue, 1 Mar 2022 20:44:38 +0800 Subject: [PATCH] readelf: Don't consider padding DT_NULL as dynamic section entry when using `$ eu-readelf -d {file}` to get the number of dynamic section entris, It wrongly counts the padding DT_NULLs as dynamic section entries. However, DT_NULL Marks end of dynamic section. They should not be counted as dynamic section entries. https://sourceware.org/bugzilla/show_bug.cgi?id=28928 Signed-off-by: Di Chen <dichen@redhat.com> --- src/readelf.c | 49 ++++++++++++++++++++++++++++++++++++------ tests/alldts.c | 5 +++-- tests/run-alldts.sh | 2 +- tests/run-readelf-d.sh | 7 +----- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/readelf.c b/src/readelf.c index 93fb5989..1bec3aa6 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_scngrp (Ebl *ebl); static void print_dynamic (Ebl *ebl); +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr); @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) } +static GElf_Phdr * +get_dyn_phdr (Elf *elf) +{ + GElf_Phdr *phdr = NULL; + for (size_t i = 0; i < phnum; ++i) { + GElf_Phdr phdr_mem; + phdr = gelf_getphdr(elf, i, &phdr_mem); + if (phdr->p_type == PT_DYNAMIC) { + break; + } + } + return phdr; +} + + +static size_t +get_dyn_scnents (Elf *elf, GElf_Phdr * dyn_phdr) +{ + Elf_Data *data = elf_getdata_rawchunk( + elf, dyn_phdr->p_offset, dyn_phdr->p_filesz, ELF_T_DYN); + GElf_Dyn *dyn; + size_t dyn_idx = 0; + do + { + GElf_Dyn dyn_mem; + dyn = gelf_getdyn(data, dyn_idx, &dyn_mem); + ++dyn_idx; + } while (dyn->d_tag != DT_NULL); + + return dyn_idx; +} + + static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) { int class = gelf_getclass (ebl->elf); + GElf_Phdr *dyn_phdr; GElf_Shdr glink_mem; GElf_Shdr *glink; Elf_Data *data; size_t cnt; size_t shstrndx; - size_t sh_entsize; + size_t dyn_scnents; + + /* Calculate the dynamic section entry number */ + dyn_phdr = get_dyn_phdr (ebl->elf); + dyn_scnents = get_dyn_scnents (ebl->elf, dyn_phdr); /* Get the data of the section. */ data = elf_getdata (scn, NULL); @@ -1802,8 +1841,6 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) error (EXIT_FAILURE, 0, _("cannot get section header string table index")); - sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT); - glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem); if (glink == NULL) error (EXIT_FAILURE, 0, _("invalid sh_link value in section %zu"), @@ -1813,15 +1850,15 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", "\ \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", - shdr->sh_size / sh_entsize), - (unsigned long int) (shdr->sh_size / sh_entsize), + dyn_scnents), + (unsigned long int) dyn_scnents, class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, shdr->sh_offset, (int) shdr->sh_link, elf_strptr (ebl->elf, shstrndx, glink->sh_name)); fputs_unlocked (_(" Type Value\n"), stdout); - for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + for (cnt = 0; cnt < dyn_scnents; ++cnt) { GElf_Dyn dynmem; GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem); diff --git a/tests/alldts.c b/tests/alldts.c index 3e9f9fe6..d0fe4f24 100644 --- a/tests/alldts.c +++ b/tests/alldts.c @@ -44,7 +44,7 @@ main (void) Dwelf_Strent *shstrtabse; const Elf32_Sword dtflags[] = { - DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, + DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, DT_HASH, DT_STRTAB, DT_SYMTAB, DT_RELA, DT_RELASZ, DT_RELAENT, DT_STRSZ, DT_SYMENT, DT_INIT, DT_FINI, DT_SONAME, DT_RPATH, @@ -61,7 +61,8 @@ main (void) DT_GNU_LIBLIST, DT_CONFIG, DT_DEPAUDIT, DT_AUDIT, DT_PLTPAD, DT_MOVETAB, DT_SYMINFO, DT_RELACOUNT, DT_RELCOUNT, DT_FLAGS_1, DT_VERDEF, DT_VERDEFNUM, - DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER + DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER, + DT_NULL }; const int ndtflags = sizeof (dtflags) / sizeof (dtflags[0]); diff --git a/tests/run-alldts.sh b/tests/run-alldts.sh index 6a9a9ece..ce3630b0 100755 --- a/tests/run-alldts.sh +++ b/tests/run-alldts.sh @@ -27,7 +27,6 @@ testrun_compare ${abs_top_builddir}/src/readelf -d testfile-alldts <<\EOF Dynamic segment contains 66 entries: Addr: 0x000001a0 Offset: 0x000078 Link to section: [ 0] '' Type Value - NULL NEEDED Shared library: [(null)] PLTRELSZ 3735928559 (bytes) PLTGOT 0xdeadbeef @@ -93,6 +92,7 @@ Dynamic segment contains 66 entries: VERNEEDNUM 3735928559 AUXILIARY 0xdeadbeef FILTER 0xdeadbeef + NULL EOF exit 0 diff --git a/tests/run-readelf-d.sh b/tests/run-readelf-d.sh index d0b6ed24..69b01c49 100755 --- a/tests/run-readelf-d.sh +++ b/tests/run-readelf-d.sh @@ -34,7 +34,7 @@ testfiles testlib_dynseg.so testrun_compare ${abs_top_builddir}/src/readelf -d testlib_dynseg.so <<\EOF -Dynamic segment contains 28 entries: +Dynamic segment contains 23 entries: Addr: 0x00000000000017e0 Offset: 0x0007e0 Link to section: [ 3] '.dynstr' Type Value PLTGOT 0x00000000000019c8 @@ -60,11 +60,6 @@ Dynamic segment contains 28 entries: VERNEED 0x0000000000000498 VERNEEDNUM 2 NULL - NULL - NULL - NULL - NULL - NULL EOF exit 0 -- 2.35.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] readelf: PR28928 - wrong dynamic section entry number 2022-03-22 13:47 ` Di Chen @ 2022-03-30 11:25 ` Di Chen 0 siblings, 0 replies; 3+ messages in thread From: Di Chen @ 2022-03-30 11:25 UTC (permalink / raw) To: elfutils-devel From b0da0a6f6c9a57a37a144a806ecd219a76c66b54 Mon Sep 17 00:00:00 2001 From: Di Chen <dichen@redhat.com> Date: Tue, 1 Mar 2022 20:44:38 +0800 Subject: [PATCH] readelf: Don't consider padding DT_NULL as dynamic section entry when using `$ eu-readelf -d {FILE}` to get the number of dynamic section entris, it wrongly counts the padding DT_NULLs as dynamic section entries. However, DT_NULL Marks end of dynamic section. They should not be considered as dynamic section entries. https://sourceware.org/bugzilla/show_bug.cgi?id=28928 Signed-off-by: Di Chen <dichen@redhat.com> --- src/readelf.c | 49 ++++++++++++++++++++++++++++++++++++------ tests/alldts.c | 5 +++-- tests/run-alldts.sh | 2 +- tests/run-readelf-d.sh | 7 +----- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/readelf.c b/src/readelf.c index 93fb5989..0d70bb47 100644 --- a/src/readelf.c +++ b/src/readelf.c @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); static void print_scngrp (Ebl *ebl); static void print_dynamic (Ebl *ebl); +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, GElf_Shdr *shdr); @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) } +static GElf_Phdr * +get_dyn_phdr (Elf *elf) +{ + GElf_Phdr *phdr = NULL; + for (size_t i = 0; i < phnum; ++i) { + GElf_Phdr phdr_mem; + phdr = gelf_getphdr(elf, i, &phdr_mem); + if (phdr->p_type == PT_DYNAMIC) { + break; + } + } + return phdr; +} + + +static size_t +get_dyn_scnents (Elf *elf, GElf_Phdr * dyn_phdr) +{ + Elf_Data *data = elf_getdata_rawchunk( + elf, dyn_phdr->p_offset, dyn_phdr->p_filesz, ELF_T_DYN); + GElf_Dyn *dyn; + size_t dyn_idx = 0; + do + { + GElf_Dyn dyn_mem; + dyn = gelf_getdyn(data, dyn_idx, &dyn_mem); + ++dyn_idx; + } while (dyn->d_tag != DT_NULL); + + return dyn_idx; +} + + static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) { int class = gelf_getclass (ebl->elf); + GElf_Phdr *dyn_phdr; GElf_Shdr glink_mem; GElf_Shdr *glink; Elf_Data *data; size_t cnt; size_t shstrndx; - size_t sh_entsize; + size_t dyn_scnents; + + /* Get the dynamic section entry number */ + dyn_phdr = get_dyn_phdr (ebl->elf); + dyn_scnents = get_dyn_scnents (ebl->elf, dyn_phdr); /* Get the data of the section. */ data = elf_getdata (scn, NULL); @@ -1802,8 +1841,6 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) error (EXIT_FAILURE, 0, _("cannot get section header string table index")); - sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT); - glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem); if (glink == NULL) error (EXIT_FAILURE, 0, _("invalid sh_link value in section %zu"), @@ -1813,15 +1850,15 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", "\ \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n", - shdr->sh_size / sh_entsize), - (unsigned long int) (shdr->sh_size / sh_entsize), + dyn_scnents), + (unsigned long int) dyn_scnents, class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, shdr->sh_offset, (int) shdr->sh_link, elf_strptr (ebl->elf, shstrndx, glink->sh_name)); fputs_unlocked (_(" Type Value\n"), stdout); - for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) + for (cnt = 0; cnt < dyn_scnents; ++cnt) { GElf_Dyn dynmem; GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem); diff --git a/tests/alldts.c b/tests/alldts.c index 3e9f9fe6..d0fe4f24 100644 --- a/tests/alldts.c +++ b/tests/alldts.c @@ -44,7 +44,7 @@ main (void) Dwelf_Strent *shstrtabse; const Elf32_Sword dtflags[] = { - DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, + DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, DT_HASH, DT_STRTAB, DT_SYMTAB, DT_RELA, DT_RELASZ, DT_RELAENT, DT_STRSZ, DT_SYMENT, DT_INIT, DT_FINI, DT_SONAME, DT_RPATH, @@ -61,7 +61,8 @@ main (void) DT_GNU_LIBLIST, DT_CONFIG, DT_DEPAUDIT, DT_AUDIT, DT_PLTPAD, DT_MOVETAB, DT_SYMINFO, DT_RELACOUNT, DT_RELCOUNT, DT_FLAGS_1, DT_VERDEF, DT_VERDEFNUM, - DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER + DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER, + DT_NULL }; const int ndtflags = sizeof (dtflags) / sizeof (dtflags[0]); diff --git a/tests/run-alldts.sh b/tests/run-alldts.sh index 6a9a9ece..ce3630b0 100755 --- a/tests/run-alldts.sh +++ b/tests/run-alldts.sh @@ -27,7 +27,6 @@ testrun_compare ${abs_top_builddir}/src/readelf -d testfile-alldts <<\EOF Dynamic segment contains 66 entries: Addr: 0x000001a0 Offset: 0x000078 Link to section: [ 0] '' Type Value - NULL NEEDED Shared library: [(null)] PLTRELSZ 3735928559 (bytes) PLTGOT 0xdeadbeef @@ -93,6 +92,7 @@ Dynamic segment contains 66 entries: VERNEEDNUM 3735928559 AUXILIARY 0xdeadbeef FILTER 0xdeadbeef + NULL EOF exit 0 diff --git a/tests/run-readelf-d.sh b/tests/run-readelf-d.sh index d0b6ed24..69b01c49 100755 --- a/tests/run-readelf-d.sh +++ b/tests/run-readelf-d.sh @@ -34,7 +34,7 @@ testfiles testlib_dynseg.so testrun_compare ${abs_top_builddir}/src/readelf -d testlib_dynseg.so <<\EOF -Dynamic segment contains 28 entries: +Dynamic segment contains 23 entries: Addr: 0x00000000000017e0 Offset: 0x0007e0 Link to section: [ 3] '.dynstr' Type Value PLTGOT 0x00000000000019c8 @@ -60,11 +60,6 @@ Dynamic segment contains 28 entries: VERNEED 0x0000000000000498 VERNEEDNUM 2 NULL - NULL - NULL - NULL - NULL - NULL EOF exit 0 -- 2.35.1 On Tue, Mar 22, 2022 at 9:47 PM Di Chen <dichen@redhat.com> wrote: > Hey team, > I made some changes for this patch: > (1) update the commit message to make it more clear > (2) tests/alldts.c needs the padding spaces for output comparison > > On Tue, Mar 1, 2022 at 8:54 PM Di Chen <dichen@redhat.com> wrote: > >> commit 978663c5323cf402cd35b8614e41f24b587cbdd8 (HEAD -> dichen/DT_NULL, >> origin/dichen/DT_NULL) >> Author: Di Chen <dichen@redhat.com> >> Date: Tue Mar 1 20:44:38 2022 +0800 >> >> readelf: PR28928 - wrong dynamic section entry number >> >> when using `$ eu-readelf -d {file}` to get the number of dynamic >> section entris, It wrongly counts the padding DT_NULLs as dynamic >> section entries. However, DT_NULL Marks end of dynamic section. >> They should not be counted as dynamic section entries. >> >> https://sourceware.org/bugzilla/show_bug.cgi?id=28928 >> >> Signed-off-by: Di Chen <dichen@redhat.com> >> >> diff --git a/src/readelf.c b/src/readelf.c >> index 93fb5989..1bec3aa6 100644 >> --- a/src/readelf.c >> +++ b/src/readelf.c >> @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); >> static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); >> static void print_scngrp (Ebl *ebl); >> static void print_dynamic (Ebl *ebl); >> +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); >> static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); >> static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, >> GElf_Shdr *shdr); >> @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) >> [dichen@arpeggio elfutils]$ git format-patch -1 HEAD >> 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch >> [dichen@arpeggio elfutils]$ vim >> 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch >> [dichen@arpeggio elfutils]$ cat >> 0001-readelf-PR28928-wrong-dynamic-section-entry-number.patch >> From 978663c5323cf402cd35b8614e41f24b587cbdd8 Mon Sep 17 00:00:00 2001 >> From: Di Chen <dichen@redhat.com> >> Date: Tue, 1 Mar 2022 20:44:38 +0800 >> Subject: [PATCH] readelf: PR28928 - wrong dynamic section entry number >> >> when using `$ eu-readelf -d {file}` to get the number of dynamic >> section entris, It wrongly counts the padding DT_NULLs as dynamic >> section entries. However, DT_NULL Marks end of dynamic section. >> They should not be counted as dynamic section entries. >> >> https://sourceware.org/bugzilla/show_bug.cgi?id=28928 >> >> Signed-off-by: Di Chen <dichen@redhat.com> >> --- >> src/readelf.c | 49 ++++++++++++++++++++++++++++++++++++------ >> tests/alldts.c | 5 +++-- >> tests/run-alldts.sh | 2 +- >> tests/run-readelf-d.sh | 7 +----- >> 4 files changed, 48 insertions(+), 15 deletions(-) >> >> diff --git a/src/readelf.c b/src/readelf.c >> index 93fb5989..1bec3aa6 100644 >> --- a/src/readelf.c >> +++ b/src/readelf.c >> @@ -296,6 +296,7 @@ static void print_shdr (Ebl *ebl, GElf_Ehdr *ehdr); >> static void print_phdr (Ebl *ebl, GElf_Ehdr *ehdr); >> static void print_scngrp (Ebl *ebl); >> static void print_dynamic (Ebl *ebl); >> +static void handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr); >> static void print_relocs (Ebl *ebl, GElf_Ehdr *ehdr); >> static void handle_relocs_rel (Ebl *ebl, GElf_Ehdr *ehdr, Elf_Scn *scn, >> GElf_Shdr *shdr); >> @@ -1781,16 +1782,54 @@ print_dt_posflag_1 (int class, GElf_Xword d_val) >> } >> >> >> +static GElf_Phdr * >> +get_dyn_phdr (Elf *elf) >> +{ >> + GElf_Phdr *phdr = NULL; >> + for (size_t i = 0; i < phnum; ++i) { >> + GElf_Phdr phdr_mem; >> + phdr = gelf_getphdr(elf, i, &phdr_mem); >> + if (phdr->p_type == PT_DYNAMIC) { >> + break; >> + } >> + } >> + return phdr; >> +} >> + >> + >> +static size_t >> +get_dyn_scnents (Elf *elf, GElf_Phdr * dyn_phdr) >> +{ >> + Elf_Data *data = elf_getdata_rawchunk( >> + elf, dyn_phdr->p_offset, dyn_phdr->p_filesz, ELF_T_DYN); >> + GElf_Dyn *dyn; >> + size_t dyn_idx = 0; >> + do >> + { >> + GElf_Dyn dyn_mem; >> + dyn = gelf_getdyn(data, dyn_idx, &dyn_mem); >> + ++dyn_idx; >> + } while (dyn->d_tag != DT_NULL); >> + >> + return dyn_idx; >> +} >> + >> + >> static void >> handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr) >> { >> int class = gelf_getclass (ebl->elf); >> + GElf_Phdr *dyn_phdr; >> GElf_Shdr glink_mem; >> GElf_Shdr *glink; >> Elf_Data *data; >> size_t cnt; >> size_t shstrndx; >> - size_t sh_entsize; >> + size_t dyn_scnents; >> + >> + /* Calculate the dynamic section entry number */ >> + dyn_phdr = get_dyn_phdr (ebl->elf); >> + dyn_scnents = get_dyn_scnents (ebl->elf, dyn_phdr); >> >> /* Get the data of the section. */ >> data = elf_getdata (scn, NULL); >> @@ -1802,8 +1841,6 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr >> *shdr) >> error (EXIT_FAILURE, 0, >> _("cannot get section header string table index")); >> >> - sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT); >> - >> glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), >> &glink_mem); >> if (glink == NULL) >> error (EXIT_FAILURE, 0, _("invalid sh_link value in section %zu"), >> @@ -1813,15 +1850,15 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr >> *shdr) >> \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: >> %#08" PRIx64 " Link to section: [%2u] '%s'\n", >> "\ >> \nDynamic segment contains %lu entries:\n Addr: %#0*" PRIx64 " Offset: >> %#08" PRIx64 " Link to section: [%2u] '%s'\n", >> - shdr->sh_size / sh_entsize), >> - (unsigned long int) (shdr->sh_size / sh_entsize), >> + dyn_scnents), >> + (unsigned long int) dyn_scnents, >> class == ELFCLASS32 ? 10 : 18, shdr->sh_addr, >> shdr->sh_offset, >> (int) shdr->sh_link, >> elf_strptr (ebl->elf, shstrndx, glink->sh_name)); >> fputs_unlocked (_(" Type Value\n"), stdout); >> >> - for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt) >> + for (cnt = 0; cnt < dyn_scnents; ++cnt) >> { >> GElf_Dyn dynmem; >> GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dynmem); >> diff --git a/tests/alldts.c b/tests/alldts.c >> index 3e9f9fe6..d0fe4f24 100644 >> --- a/tests/alldts.c >> +++ b/tests/alldts.c >> @@ -44,7 +44,7 @@ main (void) >> Dwelf_Strent *shstrtabse; >> const Elf32_Sword dtflags[] = >> { >> - DT_NULL, DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, >> + DT_NEEDED, DT_PLTRELSZ, DT_PLTGOT, >> DT_HASH, DT_STRTAB, DT_SYMTAB, DT_RELA, >> DT_RELASZ, DT_RELAENT, DT_STRSZ, DT_SYMENT, >> DT_INIT, DT_FINI, DT_SONAME, DT_RPATH, >> @@ -61,7 +61,8 @@ main (void) >> DT_GNU_LIBLIST, DT_CONFIG, DT_DEPAUDIT, DT_AUDIT, >> DT_PLTPAD, DT_MOVETAB, DT_SYMINFO, DT_RELACOUNT, >> DT_RELCOUNT, DT_FLAGS_1, DT_VERDEF, DT_VERDEFNUM, >> - DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER >> + DT_VERNEED, DT_VERNEEDNUM, DT_AUXILIARY, DT_FILTER, >> + DT_NULL >> }; >> const int ndtflags = sizeof (dtflags) / sizeof (dtflags[0]); >> >> diff --git a/tests/run-alldts.sh b/tests/run-alldts.sh >> index 6a9a9ece..bd750a35 100755 >> --- a/tests/run-alldts.sh >> +++ b/tests/run-alldts.sh >> @@ -27,7 +27,6 @@ testrun_compare ${abs_top_builddir}/src/readelf -d >> testfile-alldts <<\EOF >> Dynamic segment contains 66 entries: >> Addr: 0x000001a0 Offset: 0x000078 Link to section: [ 0] '' >> Type Value >> - NULL >> NEEDED Shared library: [(null)] >> PLTRELSZ 3735928559 (bytes) >> PLTGOT 0xdeadbeef >> @@ -93,6 +92,7 @@ Dynamic segment contains 66 entries: >> VERNEEDNUM 3735928559 >> AUXILIARY 0xdeadbeef >> FILTER 0xdeadbeef >> + NULL >> EOF >> >> exit 0 >> diff --git a/tests/run-readelf-d.sh b/tests/run-readelf-d.sh >> index d0b6ed24..69b01c49 100755 >> --- a/tests/run-readelf-d.sh >> +++ b/tests/run-readelf-d.sh >> @@ -34,7 +34,7 @@ testfiles testlib_dynseg.so >> >> testrun_compare ${abs_top_builddir}/src/readelf -d testlib_dynseg.so >> <<\EOF >> >> -Dynamic segment contains 28 entries: >> +Dynamic segment contains 23 entries: >> Addr: 0x00000000000017e0 Offset: 0x0007e0 Link to section: [ 3] >> '.dynstr' >> Type Value >> PLTGOT 0x00000000000019c8 >> @@ -60,11 +60,6 @@ Dynamic segment contains 28 entries: >> VERNEED 0x0000000000000498 >> VERNEEDNUM 2 >> NULL >> - NULL >> - NULL >> - NULL >> - NULL >> - NULL >> EOF >> >> exit 0 >> -- >> 2.34.1 >> >> ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-03-30 11:26 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-03-01 12:54 [PATCH] readelf: PR28928 - wrong dynamic section entry number Di Chen 2022-03-22 13:47 ` Di Chen 2022-03-30 11:25 ` Di Chen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).