From 099dd52727f2ce1a2c73cde82af8cd5e06368aec Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 13 Aug 2007 22:58:36 +0000 Subject: [PATCH] missed testdata files --- libdwfl/ChangeLog | 12 ++++++++++++ libdwfl/dwfl_module_addrsym.c | 3 +-- libdwfl/elf-from-memory.c | 8 ++++++-- libdwfl/linux-kernel-modules.c | 4 ++-- libelf/ChangeLog | 5 +++++ libelf/elf32_updatefile.c | 17 ++++++++++++++--- src/ChangeLog | 8 ++++++++ src/elflint.c | 11 ++++++++++- tests/ChangeLog | 8 ++++++++ tests/Makefile.am | 7 ++++--- tests/run-strip-test7.sh | 5 +++++ tests/testfile39.bz2 | Bin 0 -> 2992 bytes tests/testfile40.bz2 | Bin 0 -> 2302 bytes tests/testfile40.debug.bz2 | Bin 0 -> 1398 bytes 14 files changed, 75 insertions(+), 13 deletions(-) create mode 100755 tests/run-strip-test7.sh create mode 100644 tests/testfile39.bz2 create mode 100644 tests/testfile40.bz2 create mode 100644 tests/testfile40.debug.bz2 diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 38f86a7d5..a5177aca5 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,15 @@ +2007-08-13 Roland McGrath + + * dwfl_module_addrsym.c: Add dead initializer for stupid compiler. + +2007-08-12 Roland McGrath + + * linux-kernel-modules.c (dwfl_linux_kernel_report_offline): Don't use + FTS_LOGICAL. + + * elf-from-memory.c (elf_from_remote_memory): Don't reset LOADBASE on + a second phdr if it happens to match EHDR_VMA exactly. + 2007-08-08 Roland McGrath * dwfl_module_addrsym.c: Don't use STT_SECTION, STT_FILE symbols and diff --git a/libdwfl/dwfl_module_addrsym.c b/libdwfl/dwfl_module_addrsym.c index 63eca7745..52dbb3d88 100644 --- a/libdwfl/dwfl_module_addrsym.c +++ b/libdwfl/dwfl_module_addrsym.c @@ -104,9 +104,8 @@ dwfl_module_addrsym (Dwfl_Module *mod, GElf_Addr addr, /* Keep track of an eligible symbol with st_size == 0 as a fallback. */ const char *sizeless_name = NULL; - GElf_Sym sizeless_sym; + GElf_Sym sizeless_sym = { 0, 0, 0, 0, 0, SHN_UNDEF }; GElf_Word sizeless_shndx = SHN_UNDEF; - sizeless_sym.st_value = 0; /* Keep track of the lowest address a relevant sizeless symbol could have. */ GElf_Addr min_label = addr; diff --git a/libdwfl/elf-from-memory.c b/libdwfl/elf-from-memory.c index a292210ae..c0e7c46d7 100644 --- a/libdwfl/elf-from-memory.c +++ b/libdwfl/elf-from-memory.c @@ -213,6 +213,7 @@ elf_from_remote_memory (GElf_Addr ehdr_vma, size_t contents_size = 0; GElf_Off segments_end = 0; GElf_Addr loadbase = ehdr_vma; + bool found_base = false; switch (ehdr.e32.e_ident[EI_CLASS]) { inline void handle_segment (GElf_Addr vaddr, GElf_Off offset, @@ -223,8 +224,11 @@ elf_from_remote_memory (GElf_Addr ehdr_vma, if (segment_end > (GElf_Off) contents_size) contents_size = segment_end; - if ((offset & -align) == 0 && loadbase == ehdr_vma) - loadbase = ehdr_vma - (vaddr & -align); + if (!found_base && (offset & -align) == 0) + { + loadbase = ehdr_vma - (vaddr & -align); + found_base = true; + } segments_end = offset + filesz; } diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c index 98957521b..26f185f32 100644 --- a/libdwfl/linux-kernel-modules.c +++ b/libdwfl/linux-kernel-modules.c @@ -215,7 +215,7 @@ dwfl_linux_kernel_report_offline (Dwfl *dwfl, const char *release, return errno; } - FTS *fts = fts_open (modulesdir, FTS_LOGICAL | FTS_NOSTAT, NULL); + FTS *fts = fts_open (modulesdir, FTS_NOSTAT, NULL); if (modulesdir[0] == (char *) release) modulesdir[0] = NULL; if (fts == NULL) @@ -403,7 +403,7 @@ dwfl_linux_kernel_find_elf (Dwfl_Module *mod __attribute__ ((unused)), if (asprintf (&modulesdir[0], MODULEDIRFMT, release) < 0) return -1; - FTS *fts = fts_open (modulesdir, FTS_LOGICAL | FTS_NOSTAT, NULL); + FTS *fts = fts_open (modulesdir, FTS_NOSTAT, NULL); if (fts == NULL) { free (modulesdir[0]); diff --git a/libelf/ChangeLog b/libelf/ChangeLog index 37b60730f..a26728cdf 100644 --- a/libelf/ChangeLog +++ b/libelf/ChangeLog @@ -1,3 +1,8 @@ +2007-08-12 Roland McGrath + + * elf32_updatefile.c (compare_sections): Sort secondarily on sh_size, + and only tertiarily on index. + 2007-07-09 Roland McGrath * elf.h: Update from glibc. diff --git a/libelf/elf32_updatefile.c b/libelf/elf32_updatefile.c index 682536515..e94de8318 100644 --- a/libelf/elf32_updatefile.c +++ b/libelf/elf32_updatefile.c @@ -1,5 +1,5 @@ /* Write changed data structures. - Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006 Red Hat, Inc. + Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper , 2000. @@ -85,6 +85,14 @@ compare_sections (const void *a, const void *b) > (*scnb)->shdr.ELFW(e,LIBELFBITS)->sh_offset) return 1; + if ((*scna)->shdr.ELFW(e,LIBELFBITS)->sh_size + < (*scnb)->shdr.ELFW(e,LIBELFBITS)->sh_size) + return -1; + + if ((*scna)->shdr.ELFW(e,LIBELFBITS)->sh_size + > (*scnb)->shdr.ELFW(e,LIBELFBITS)->sh_size) + return 1; + if ((*scna)->index < (*scnb)->index) return -1; @@ -97,7 +105,10 @@ compare_sections (const void *a, const void *b) /* Insert the sections in the list into the provided array and sort them according to their start offsets. For sections with equal - start offsets the section index is used. */ + start offsets, the size is used; for sections with equal start + offsets and sizes, the section index is used. Sorting by size + ensures that zero-length sections are processed first, which + is what we want since they do not advance our file writing position. */ static void sort_sections (Elf_Scn **scns, Elf_ScnList *list) { @@ -684,7 +695,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum) sizeof (ElfW2(LIBELFBITS,Shdr))); shdr_flags |= scn->shdr_flags; - scn->shdr_flags &= ~ELF_F_DIRTY; + scn->shdr_flags &= ~ELF_F_DIRTY; } /* Fill the gap between last section and section header table if diff --git a/src/ChangeLog b/src/ChangeLog index 3e7083786..77c983810 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2007-08-12 Roland McGrath + + * elflint.c (check_note): Accept type 0 with name "Linux". + + * elflint.c (special_sections): Accept SHF_ALLOC for ".note". + + * elflint.c (section_flags_string): Return "none" for 0, not "". + 2007-08-11 Roland McGrath * elflint.c (check_note): Accept NT_GNU_HWCAP, NT_GNU_BUILD_ID. diff --git a/src/elflint.c b/src/elflint.c index e8787d011..37936b1f0 100644 --- a/src/elflint.c +++ b/src/elflint.c @@ -2461,6 +2461,9 @@ section [%2d] '%s' is contained in more than one section group\n"), static const char * section_flags_string (GElf_Word flags, char *buf, size_t len) { + if (flags == 0) + return "none"; + static const struct { GElf_Word flag; @@ -3102,7 +3105,7 @@ static const struct { ".init_array", 12, SHT_INIT_ARRAY, exact, SHF_ALLOC | SHF_WRITE, 0 }, { ".interp", 8, SHT_PROGBITS, atleast, 0, SHF_ALLOC }, // XXX more tests? { ".line", 6, SHT_PROGBITS, exact, 0, 0 }, - { ".note", 6, SHT_NOTE, exact, 0, 0 }, + { ".note", 6, SHT_NOTE, atleast, 0, SHF_ALLOC }, { ".plt", 5, SHT_PROGBITS, unused, 0, 0 }, // XXX more tests { ".preinit_array", 15, SHT_PREINIT_ARRAY, exact, SHF_ALLOC | SHF_WRITE, 0 }, { ".rela", 5, SHT_RELA, atleast, 0, SHF_ALLOC }, // XXX more tests @@ -3700,6 +3703,12 @@ phdr[%d]: unknown core file note type %" PRIu64 " at offset %" PRIu64 "\n"), /* Known type. */ break; + case 0: + /* Linux vDSOs use a type 0 note for the kernel version word. */ + if (namesz == sizeof "Linux" + && !memcmp (notemem + idx + 3 * align, "Linux", sizeof "Linux")) + break; + default: ERROR (gettext ("\ phdr[%d]: unknown object file note type %" PRIu64 " at offset %" PRIu64 "\n"), diff --git a/tests/ChangeLog b/tests/ChangeLog index 6ac600776..cc7e07279 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,11 @@ +2007-08-12 Roland McGrath + + * run-strip-test7.sh: New file. + * testfile39.bz2: New data file. + * testfile40.bz2: New data file. + * testfile40.debug.bz2: New data file. + * Makefile.am (TESTS, EXTRA_DIST): Add them. + 2007-08-09 Roland McGrath * dwfl-bug-report.c: Fix header inclusion. diff --git a/tests/Makefile.am b/tests/Makefile.am index 040351f91..decefe77e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -71,7 +71,8 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ run-show-abbrev.sh run-line2addr.sh hash \ newscn run-strip-test.sh run-strip-test2.sh \ run-strip-test3.sh run-strip-test4.sh run-strip-test5.sh \ - run-strip-test6.sh run-unstrip-test.sh run-unstrip-test2.sh \ + run-strip-test6.sh run-strip-test7.sh \ + run-unstrip-test.sh run-unstrip-test2.sh \ run-ecp-test.sh run-ecp-test2.sh \ run-elflint-test.sh run-elflint-self.sh run-ranlib-test.sh \ run-ranlib-test2.sh run-ranlib-test3.sh run-ranlib-test4.sh \ @@ -105,7 +106,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ testfile13.bz2 run-strip-test3.sh run-allfcts.sh \ run-line2addr.sh run-elflint-test.sh testfile14.bz2 \ run-strip-test4.sh run-strip-test5.sh run-strip-test6.sh \ - run-unstrip-test.sh run-unstrip-test2.sh \ + run-strip-test7.sh run-unstrip-test.sh run-unstrip-test2.sh \ run-elflint-self.sh run-ranlib-test.sh run-ranlib-test2.sh \ run-ranlib-test3.sh run-ranlib-test4.sh \ run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ @@ -126,7 +127,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ testfile34.bz2 testfile35.bz2 testfile35.debug.bz2 \ testfile36.bz2 testfile36.debug.bz2 \ testfile37.bz2 testfile37.debug.bz2 \ - testfile38.bz2 + testfile38.bz2 testfile39.bz2 testfile40.bz2 testfile40.debug.bz2 installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \ bindir=$(DESTDIR)$(bindir) \ diff --git a/tests/run-strip-test7.sh b/tests/run-strip-test7.sh new file mode 100755 index 000000000..c65cd0504 --- /dev/null +++ b/tests/run-strip-test7.sh @@ -0,0 +1,5 @@ +original=testfile39 +stripped=testfile40 +debugfile=testfile40.debug + +. $srcdir/run-strip-test.sh diff --git a/tests/testfile39.bz2 b/tests/testfile39.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..42d0fbceeb20dba9bb03a06e4758e2357b9cfdf6 GIT binary patch literal 2992 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 mng26~LnU-!em$!j7aOD8v&SVw< literal 0 Hc-jL100001 diff --git a/tests/testfile40.bz2 b/tests/testfile40.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..ad41985ce63cfcd2046f7155d4e471433a0f9e8c GIT binary patch literal 2302 zc-jH}2m$v(T4*^jL0KkKS#>Tn@&E>>|NsC0|NsC0|NsC0|NsC0|NsC0&QSkc;pRX_1~i%m5Yqqz(W65I!eC7rX{L<<5D}wP%#AdgPfBQ-XvhE> zG-zl6rkOO;)EWao000Ic01W^G)EW%{0002fKxiEvntG;y0BF-d00E()>NGR}003lU z0Av8f0g%uD00000003whfFKPG8UdhWG-M2!0AUQ82ATjF20@SjU<3w$00T_`02(v^ z00000BuNC&2-M99w3$b>PfB?wnoSeb+6n2X)7cs*-lTd!)6~he8Xl8OPgB&;+D}bJ zntG2@L)01%D8y|*4=42d^f|!$VarzH{d}igEN0- zXh-${Ryx*ChVYTzb=YTFFP;&yg=`+Cv;a3|skqLzM$?C$&)FaiL7m-a{70w=mlYd4;`hjVo8h;in|!)`PIGdCF&Pi(XO8ujf{>x$RCIg$Tg4;z+sherAh;6P{Gwk5zeZM2BqwEr?sww!8VMHQE zQ4ZbM@lv%{K)3~f&_7<(fC7A10s==7-nC3v^exd-QP>ZJ)u;XPVSgsI{uiM`0W(4kpTGD&s_zef=k}VMKkL_j&g;SDZ1|m#jAI~hK(=WY;2X(u z%7GC?2i0gYZV=J{ssp`Z$JXS?GgiEVG89%U_cnITN{?J!D(#v6fa778BhY@iDN0m0TRi{4ZO2*^Y?liePj}qd=1*X&uUEM$sks2l75F}0I zUh$)uUIRAvR@NN4%1MfqwbpZv8ThUH_P#m!x?4MI3r@wv?Qe0i`zJ0gZSEahy1I&C z6oQWoj7S-vjF^S$)ySAk!$S!LNE;*XvWa$c!6tj*icK7f0w>z$R;KL{0|rD!pISv} zw=_c)2J23VKTosSV7|8|@cdFS-)L&tz&w^Vw8s!(!pm>FVCVQ|D9;A4sM61jL z7%t(1Fcg48BwsmW7QU=iCV8=1r^UAxt+amHW_a#6fH>OXN%1@nheg*#$w-m6b)?Hq zC1w%Yz3}(16d1Fq&#EW-S$wIcF0?Lh;Dl;3gv622q$)<@MPIUek2P(Gj!`RDN zU(A|n`J2riA8$>KvnF8pWv6y7=>weJTyL z6CS3Pq7d^uV;La;eWcJGVTFql^fCd3xIj?VWZ(n~;MFC7F)c(YXF@{*8u0|~AfqiA zvZD$VHN8+6>}!|P-r#%<23Ue8c(BS&`sNXgU)lTty4cOy5RvuPHmtRH0Y*U3i zlBtI`y3DyqNGgTSd8D@|QoQ-|eMw3(5@O9+|5iwG$@XnC1_pT|M0cCE4nir{B(%90 zq$QMQUEUsKDD2XidMrqmvYh1+slB7Pe%6>jE7-Z}t7v>l%^b=#yR5n~Qyi<&{+sh7 zRpW2t5+l^SM4i4(+mkD``?>ZkqutX9uNDM$2QBb8N1fvv>CW(al0gt}A#TgvU9O`W zG+4PE=GZ0S*|T`I?+%W*?x-`VZ0?0$Wx$3d=l}u;EFOe~I4CA($ip}S=_&{)mQoBF z>}-OGbsi#%S(JHn<(13mFi`NIxJA5*=!-hbqs!0 zP$KNTt>ppSbS5VTU@{uK$SG|W(0@6+d{J0oe+E8Pb7@tHsco5)&k(i9C&`grNW5At zSeTy@+S>No>$o!O<;_K$A748_Nu}DbNY2hPN0AXy5I`j(h&#))!x6xVUM%p|77}3a z7$6Omk6@V)fN)=AqXwXgcoPsV*+DysrNVdyD{(m(%oTw`={njjg?(Xya--WOE$6Xt z7Cy3`cnk&uC|A>8rm>enBrL~DV*ySg)Rcig_g^+SxPAAVnLgi$-;0!M|Cxr5!iz|N(@ECw#0}_Pf5kOM` zN36rD7_XMcsEtr<$w(TDmOHT}F@3o7rgBtyxdUT$wJE$FZk5Pw1fl z%XRh`-kPoLG%^h2>-B>=HFiEOjkB-Ku09N0oX2}6T2ka~K3zRa<-Yc^n-;FAnAGnH z5tj%#wWDCg4+{or5eRK`nuZKuH=5gqnNpNCKog2|A02;cdxHi4-rhsKdyF#F&c~`) Y1|o_(hFhqH+~te8BAh5lI+q%G0AH3q4FCWD literal 0 Hc-jL100001 diff --git a/tests/testfile40.debug.bz2 b/tests/testfile40.debug.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2eec4d7a5b2b78dbb0e7cfcb7e40c8784693fe46 GIT binary patch literal 1398 zc-jGW1&R7XT4*^jL0KkKS$N||8vq85fB*mg|M>g&|Hp6tTV((5|L@R9_z*!vBtm#l zh(-cLS6!@9-sgLpa2a300w{{(<2F^Od!NDG{6y&rXh)d6D9x&kZ8aF5t9j%08AqU zi4a3g85I3ZB+2BAPf!gs0MOGTK+pg*GzX~AXwU!v84Un*;DD7U3>74rN=l!()k26{ z)b}pe$}Ky2)LMKv#@Iuek4%3p7)ke`IQ|*^S{EV6^_(fndFgQd8|g`=l@_I)O;e;O zm=GA$#Dcp6P^;EnQl=q1)Qc{*wlLB&&C;seF1W+$(sEqpB-bnu4T-IuDXIo}3&b#H z;{`lmMFdeo+mE#rr$D6D+u4h^K7#+4QtLg!)9+Y4md|MeU{j`Zv%JZ;kME&&+dznl zksN`OT1{q15m>dAL!!wLA-pmo-M5Q|j0aCd$ZxxdK!*p1m(9%Z=Um5+?e175x?q!O zUi4wAQ^JZ^reWN&d>)oZZtAZm9(g(|5uLqifFh)s!%NrOXR z+CubGO`&<2!U0red;pRV9FNWt=SKsF&HDeU*Ok37q$Jt|bj(3C$bk^90gZ`*4^TiB zW%9XG=Nxfz-#xxJzS;NmW?|Uelym{2QV5I?S<%mp4QAF zNaVTDbCZb!rAZP)1{6`VJ|Iy@(h`;+(MV*lsoKJM@DVcR7}EH$DJs??R}*)O@g`=&T~8Z> z3g4AEoob?+s3xUV4GpLA(I9SPjL}Q0OVc7G5tevSH9e#VTdjR_tW18+8J66TLI1cfV2t#-s_;s z!*5!IFDx{Lw+cX3p7qj6J1V*8GbXuB6rsiQ#|OftJDh$e(o_N2FB2b*-r1n$hHcUk ztqc$GjGcRwKoS6a6_)@Dw7)#3XBhA(fn*GE+NhebMXMGH(-K1$p3aGVcl1cL6bInFEfEiOf>A* z4yCVdTyPA-C{s;WhMfA#9EKV4n}99XE(xNT10i4+?uHqu+}yvM#Zd@fd#slh#4(|k zecmrsisOW)VN;F`nQ#-}PZLxANP-+0?CIhpQbd;6H5k5E@UP4uiy!fKBvXY62aYsx Eu+kG`0{{R3 literal 0 Hc-jL100001 -- 2.47.2