From aa915fd3d70b4cbe4581f9ec170d986c6ba35063 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 5 Feb 2007 07:25:33 +0000 Subject: [PATCH] propagate from branch 'com.redhat.elfutils.roland.pending' (head c44dcfac5b545aecb173fede31f34cb003be0173) to branch 'com.redhat.elfutils' (head 4196d4e01486bdeb0c0632291881d1c6d7163fab) --- backends/ChangeLog | 7 +++ backends/ia64_init.c | 3 +- backends/ia64_symbol.c | 11 ++++- libdw/ChangeLog | 7 +++ libdw/dwarf_getelf.c | 4 +- libdw/libdw.map | 8 +++- libdwfl/ChangeLog | 29 ++++++++++++ libdwfl/argp-std.c | 6 ++- libdwfl/derelocate.c | 15 +++++- libdwfl/dwfl_addrmodule.c | 15 ++++-- libdwfl/dwfl_module_addrname.c | 67 ++++++++++++++++++++++++--- libdwfl/dwfl_version.c | 4 +- libdwfl/libdwfl.h | 3 +- libdwfl/linux-kernel-modules.c | 6 +-- libdwfl/offline.c | 13 +++--- libdwfl/relocate.c | 15 +++--- libebl/ChangeLog | 9 ++++ libebl/Makefile.am | 5 +- libebl/ebl-hooks.h | 5 +- libebl/eblmachinesectionflagcheck.c | 63 +++++++++++++++++++++++++ libebl/eblopenbackend.c | 10 +++- libebl/libebl.h | 5 +- libelf/ChangeLog | 13 ++++++ libelf/elf32_getshdr.c | 69 ++++++++++++++++------------ libelf/gelf_rawchunk.c | 3 +- libelf/gnuhash_xlate.h | 4 +- src/ChangeLog | 5 ++ src/elflint.c | 25 +++++++--- tests/ChangeLog | 23 ++++++++++ tests/Makefile.am | 7 +-- tests/run-addrname-test.sh | 47 +++++++++++++++++++ tests/run-elflint-test.sh | 8 +++- tests/testfile32.bz2 | Bin 0 -> 5778 bytes tests/testfile33.bz2 | Bin 0 -> 35075 bytes tests/testfile34.bz2 | Bin 0 -> 315 bytes 35 files changed, 430 insertions(+), 84 deletions(-) create mode 100644 libebl/eblmachinesectionflagcheck.c create mode 100755 tests/run-addrname-test.sh create mode 100644 tests/testfile32.bz2 create mode 100644 tests/testfile33.bz2 create mode 100644 tests/testfile34.bz2 diff --git a/backends/ChangeLog b/backends/ChangeLog index 86ac44b96..57f33608b 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,10 @@ +2007-01-11 Roland McGrath + + * ia64_symbol.c (ia64_machine_section_flag_check): New function. + * ia64_init.c (ia64_init): Use it. + + * ia64_symbol.c (ia64_section_type_name): Typo fix in string. + 2006-10-09 Roland McGrath * ia64_symbol.c (ia64_reloc_simple_type): Treat SECREL types as simple. diff --git a/backends/ia64_init.c b/backends/ia64_init.c index acae23463..290c192c8 100644 --- a/backends/ia64_init.c +++ b/backends/ia64_init.c @@ -1,5 +1,5 @@ /* Initialization of IA-64 specific backend library. - Copyright (C) 2002, 2003, 2005, 2006 Red Hat, Inc. + Copyright (C) 2002, 2003, 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper , 2002. @@ -55,6 +55,7 @@ ia64_init (elf, machine, eh, ehlen) HOOK (eh, dynamic_tag_name); HOOK (eh, dynamic_tag_check); HOOK (eh, machine_flag_check); + HOOK (eh, machine_section_flag_check); HOOK (eh, register_info); HOOK (eh, return_value_location); diff --git a/backends/ia64_symbol.c b/backends/ia64_symbol.c index 4faec0c9b..2609db0f4 100644 --- a/backends/ia64_symbol.c +++ b/backends/ia64_symbol.c @@ -1,5 +1,5 @@ /* IA-64 specific symbolic name handling. - Copyright (C) 2002, 2003, 2005, 2006 Red Hat, Inc. + Copyright (C) 2002, 2003, 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper , 2002. @@ -86,6 +86,13 @@ ia64_machine_flag_check (GElf_Word flags) return ((flags &~ EF_IA_64_ABI64) == 0); } +/* Check whether SHF_MASKPROC flags are valid. */ +bool +ia64_machine_section_flag_check (GElf_Xword sh_flags) +{ + return (sh_flags &~ (SHF_IA_64_SHORT | SHF_IA_64_NORECOV)) == 0; +} + /* Return symbolic representation of section type. */ const char * ia64_section_type_name (int type, @@ -97,7 +104,7 @@ ia64_section_type_name (int type, case SHT_IA_64_EXT: return "SHT_IA_64_EXT"; case SHT_IA_64_UNWIND: - return "HT_IA_64_UNWIND"; + return "SHT_IA_64_UNWIND"; } return NULL; diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 19c5d11b9..814299b89 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,3 +1,10 @@ +2007-02-03 Roland McGrath + + * dwarf_getelf.c (dwarf_getelf): Renamed from dwarf_get_elf. + * libdw.map (ELFUTILS_0.126): New version set, inherits from + ELFUTILS_0.122. Move dwarf_getelf there; it was never truly + exported in the past. + 2006-12-17 Roland McGrath * dwarf_getlocation.c (dwarf_getlocation_addr): Use zero as base diff --git a/libdw/dwarf_getelf.c b/libdw/dwarf_getelf.c index a67246237..daf3b9a79 100644 --- a/libdw/dwarf_getelf.c +++ b/libdw/dwarf_getelf.c @@ -1,5 +1,5 @@ /* Retrieve ELF descriptor used for DWARF access. - Copyright (C) 2002, 2004 Red Hat, Inc. + Copyright (C) 2002, 2004, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper , 2002. @@ -58,7 +58,7 @@ Elf * -dwarf_get_elf (dwarf) +dwarf_getelf (dwarf) Dwarf *dwarf; { if (dwarf == NULL) diff --git a/libdw/libdw.map b/libdw/libdw.map index 6ee42ece5..71e9f50fe 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -44,7 +44,6 @@ ELFUTILS_0.122 { dwarf_getaranges; dwarf_getattrcnt; dwarf_getattrs; - dwarf_getelf; dwarf_getfuncs; dwarf_getlocation; dwarf_getlocation_addr; @@ -146,3 +145,10 @@ ELFUTILS_0.122 { local: *; } ELFUTILS_0; +ELFUTILS_0.126 { + global: + dwarf_getelf; + + local: + *; +} ELFUTILS_0.122; diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 0439d4cf2..71b167f35 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,32 @@ +2007-02-02 Roland McGrath + + * dwfl_addrmodule.c (dwfl_addrmodule): Match a module's high boundary + address exactly if it's no other module's low boundary. + + * dwfl_module_addrname.c (dwfl_module_addrname): If no symbol's value + and size cover the address, select the closest symbol with st_size==0 + that lies in the same section. + +2007-01-29 Roland McGrath + + * dwfl_version.c (dwfl_version): Return PACKAGE_VERSION, + not PACKAGE_STRING. + +2007-01-20 Roland McGrath + + * relocate.c (__libdwfl_relocate_value): Treat section_address of -1 + as omitted, not 0. + * libdwfl.h (Dwfl_Callbacks): Update comment. + * derelocate.c (cache_sections): Don't ignore sh_addr == 0 sections. + * linux-kernel-modules.c (dwfl_linux_kernel_module_section_address): + For ignored missing section, use -1 instead of 0. + * offline.c (dwfl_offline_section_address): Expect a call for 0. + +2007-01-19 Roland McGrath + + * argp-std.c (parse_opt): For -e, reset DWFL->offline_next_address to + zero so a lone -e foo.so is shown without address bias. + 2007-01-10 Roland McGrath * linux-kernel-modules.c (report_kernel): Check asprintf return value diff --git a/libdwfl/argp-std.c b/libdwfl/argp-std.c index bec370a3e..c12cb1ddf 100644 --- a/libdwfl/argp-std.c +++ b/libdwfl/argp-std.c @@ -1,5 +1,5 @@ /* Standard argp argument parsers for tools using libdwfl. - Copyright (C) 2005 Red Hat, Inc. + Copyright (C) 2005, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -137,6 +137,10 @@ parse_opt (int key, char *arg, struct argp_state *state) if (dwfl == NULL) return fail (dwfl, -1, arg); state->hook = dwfl; + + /* Start at zero so if there is just one -e foo.so, + the DSO is shown without address bias. */ + dwfl->offline_next_address = 0; } if (dwfl->callbacks == &offline_callbacks) { diff --git a/libdwfl/derelocate.c b/libdwfl/derelocate.c index c26be8d84..d110299e8 100644 --- a/libdwfl/derelocate.c +++ b/libdwfl/derelocate.c @@ -1,5 +1,5 @@ /* Recover relocatibility for addresses computed from debug information. - Copyright (C) 2005, 2006 Red Hat, Inc. + Copyright (C) 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -99,7 +99,18 @@ cache_sections (Dwfl_Module *mod) if (shdr == NULL) return -1; - if ((shdr->sh_flags & SHF_ALLOC) && shdr->sh_addr != 0) + if ((shdr->sh_flags & SHF_ALLOC) && shdr->sh_addr == 0) + { + /* This section might not yet have been looked at. */ + if (__libdwfl_relocate_value (mod, symshstrndx, elf_ndxscn (scn), + &shdr->sh_addr) != DWFL_E_NOERROR) + continue; + shdr = gelf_getshdr (scn, &shdr_mem); + if (shdr == NULL) + return -1; + } + + if (shdr->sh_flags & SHF_ALLOC) { const char *name = elf_strptr (mod->symfile->elf, symshstrndx, shdr->sh_name); diff --git a/libdwfl/dwfl_addrmodule.c b/libdwfl/dwfl_addrmodule.c index 98c4b39fd..54d9a3d92 100644 --- a/libdwfl/dwfl_addrmodule.c +++ b/libdwfl/dwfl_addrmodule.c @@ -1,5 +1,5 @@ /* Find module containing address. - Copyright (C) 2005, 2006 Red Hat, Inc. + Copyright (C) 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -55,6 +55,8 @@ dwfl_addrmodule (Dwfl *dwfl, Dwarf_Addr address) if (dwfl == NULL || dwfl->modules == NULL) return NULL; + Dwfl_Module *boundary = NULL; + /* Do binary search on the array indexed by module load address. */ size_t l = 0, u = dwfl->nmodules; while (l < u) @@ -64,11 +66,18 @@ dwfl_addrmodule (Dwfl *dwfl, Dwarf_Addr address) if (address < m->low_addr) u = idx; else if (address >= m->high_addr) - l = idx + 1; + { + l = idx + 1; + if (address == m->high_addr) + /* If the high bound of this module is not the low bound of + another, then consider the boundary address to be inside + this module. */ + boundary = m; + } else return m; } - return NULL; + return boundary; } INTDEF (dwfl_addrmodule) diff --git a/libdwfl/dwfl_module_addrname.c b/libdwfl/dwfl_module_addrname.c index 19b4c2d3d..b107448bc 100644 --- a/libdwfl/dwfl_module_addrname.c +++ b/libdwfl/dwfl_module_addrname.c @@ -1,5 +1,5 @@ /* Find debugging and symbol information for a module in libdwfl. - Copyright (C) 2005, 2006 Red Hat, Inc. + Copyright (C) 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -56,15 +56,70 @@ dwfl_module_addrname (Dwfl_Module *mod, GElf_Addr addr) if (syments < 0) return NULL; + /* Return true iff we consider ADDR to lie in the same section as SYM. */ + GElf_Word addr_shndx = SHN_UNDEF; + inline bool same_section (const GElf_Sym *sym, GElf_Word shndx) + { + /* For absolute symbols and the like, only match exactly. */ + if (shndx >= SHN_LORESERVE) + return sym->st_value == addr; + + /* Ignore section and other special symbols. */ + switch (GELF_ST_TYPE (sym->st_info)) + { + case STT_SECTION: + case STT_FILE: + case STT_TLS: + return false; + } + + /* Figure out what section ADDR lies in. */ + if (addr_shndx == SHN_UNDEF) + { + GElf_Addr mod_addr = addr - mod->symfile->bias; + Elf_Scn *scn = NULL; + addr_shndx = SHN_ABS; + while ((scn = elf_nextscn (mod->symfile->elf, scn)) != NULL) + { + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + if (likely (shdr != NULL) + && mod_addr >= shdr->sh_addr + && mod_addr < shdr->sh_addr + shdr->sh_size) + { + addr_shndx = elf_ndxscn (scn); + break; + } + } + } + + return shndx == addr_shndx; + } + /* Look through the symbol table for a matching symbol. */ + const char *closest = NULL; + GElf_Addr closest_value = 0; for (int i = 1; i < syments; ++i) { GElf_Sym sym; - const char *name = INTUSE(dwfl_module_getsym) (mod, i, &sym, NULL); - if (name != NULL - && sym.st_value <= addr && addr < sym.st_value + sym.st_size) - return name; + GElf_Word shndx; + const char *name = INTUSE(dwfl_module_getsym) (mod, i, &sym, &shndx); + if (name != NULL && sym.st_value <= addr) + { + if (addr < sym.st_value + sym.st_size) + return name; + + /* Handwritten assembly symbols sometimes have no st_size. + If no symbol with proper size includes the address, we'll + use the closest one that is in the same section as ADDR. */ + if (sym.st_size == 0 && sym.st_value >= closest_value + && same_section (&sym, shndx)) + { + closest_value = sym.st_value; + closest = name; + } + } } - return NULL; + return closest; } diff --git a/libdwfl/dwfl_version.c b/libdwfl/dwfl_version.c index c78d828b3..9c7074c55 100644 --- a/libdwfl/dwfl_version.c +++ b/libdwfl/dwfl_version.c @@ -1,5 +1,5 @@ /* Return implementation's version string suitable for printing. - Copyright (C) 2006 Red Hat, Inc. + Copyright (C) 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -53,5 +53,5 @@ const char * dwfl_version (dwfl) Dwfl *dwfl __attribute__ ((unused)); { - return PACKAGE_STRING; + return PACKAGE_VERSION; } diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h index 9fe3dca0e..ec0065627 100644 --- a/libdwfl/libdwfl.h +++ b/libdwfl/libdwfl.h @@ -76,7 +76,8 @@ typedef struct char **debuginfo_file_name); /* Fill *ADDR with the loaded address of the section called SECNAME in - the given module. This is called exactly once for each SHF_ALLOC + the given module. Use (Dwarf_Addr) -1 if this section is omitted from + accessible memory. This is called exactly once for each SHF_ALLOC section that relocations affecting DWARF data refer to, so it can easily be used to collect state about the sections referenced. */ int (*section_address) (Dwfl_Module *mod, void **userdata, diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c index a39863866..4ea391c07 100644 --- a/libdwfl/linux-kernel-modules.c +++ b/libdwfl/linux-kernel-modules.c @@ -431,14 +431,14 @@ dwfl_linux_kernel_module_section_address CONFIG_MODULE_UNLOAD, the .exit.* sections are not actually loaded at all. - Just relocate these bogusly to zero. This part of the - debug information will not be of any use. */ + Setting *ADDR to -1 tells the caller this section is + actually absent from memory. */ if (!strcmp (secname, ".modinfo") || !strcmp (secname, ".data.percpu") || !strncmp (secname, ".exit", 5)) { - *addr = 0; + *addr = (Dwarf_Addr) -1l; return DWARF_CB_OK; } diff --git a/libdwfl/offline.c b/libdwfl/offline.c index c5193860a..bde2aeb91 100644 --- a/libdwfl/offline.c +++ b/libdwfl/offline.c @@ -1,5 +1,5 @@ /* Recover relocatibility for addresses computed from debug information. - Copyright (C) 2005, 2006 Red Hat, Inc. + Copyright (C) 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -52,8 +52,9 @@ /* Since dwfl_report_elf lays out the sections already, this will only be called when the section headers of the debuginfo file are being - consulted instead. With binutils strip-to-debug, the symbol table - is in the debuginfo file and relocation looks there. */ + consulted instead, or for a section located at zeron. With binutils + strip-to-debug, the symbol table is in the debuginfo file and relocation + looks there. */ int dwfl_offline_section_address (Dwfl_Module *mod, void **userdata __attribute__ ((unused)), @@ -64,8 +65,6 @@ dwfl_offline_section_address (Dwfl_Module *mod, const GElf_Shdr *shdr __attribute__ ((unused)), Dwarf_Addr *addr) { - assert (mod->symfile != &mod->main); - GElf_Shdr shdr_mem; GElf_Shdr *main_shdr = gelf_getshdr (elf_getscn (mod->main.elf, shndx), &shdr_mem); @@ -74,9 +73,11 @@ dwfl_offline_section_address (Dwfl_Module *mod, assert (shdr->sh_addr == 0); assert (shdr->sh_flags & SHF_ALLOC); - assert (main_shdr->sh_addr != 0); assert (main_shdr->sh_flags == shdr->sh_flags); + if (main_shdr->sh_addr != 0) + assert (mod->symfile != &mod->main); + *addr = main_shdr->sh_addr; return 0; } diff --git a/libdwfl/relocate.c b/libdwfl/relocate.c index 96cedcc34..f37f83509 100644 --- a/libdwfl/relocate.c +++ b/libdwfl/relocate.c @@ -1,5 +1,5 @@ /* Relocate debug information. - Copyright (C) 2005, 2006 Red Hat, Inc. + Copyright (C) 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -78,11 +78,14 @@ __libdwfl_relocate_value (Dwfl_Module *mod, size_t symshstrndx, &refshdr->sh_addr)) return CBFAIL; - if (refshdr->sh_addr == 0) - /* The callback resolved this to zero, indicating it wasn't - really loaded but we don't really care. Mark it so we - don't check it again for the next relocation. */ - refshdr->sh_flags &= ~SHF_ALLOC; + if (refshdr->sh_addr == (Dwarf_Addr) -1l) + { + /* The callback indicated this section wasn't really loaded but we + don't really care. Mark it so we don't check it again for the + next relocation. */ + refshdr->sh_flags &= ~SHF_ALLOC; + refshdr->sh_addr = 0; /* Make no adjustment below. */ + } /* Update the in-core file's section header to show the final load address (or unloadedness). This serves as a cache, diff --git a/libebl/ChangeLog b/libebl/ChangeLog index 33fde08b5..07f640edb 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,12 @@ +2007-01-11 Roland McGrath + + * ebl-hooks.h (machine_section_flag_check): New hook. + * libebl.h: Declare ebl_machine_section_flag_check. + * eblmachinesectionflagcheck.c: New file. + * Makefile.am (gen_SOURCES): Add it. + * eblopenbackend.c (default_machine_section_flag_check): New function. + (fill_defaults): Use it. + 2006-09-04 Roland McGrath * ebl-hooks.h: Replace register_name hook with register_info. diff --git a/libebl/Makefile.am b/libebl/Makefile.am index 48042d9fe..741e5eee3 100644 --- a/libebl/Makefile.am +++ b/libebl/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to create Makefile.in ## -## Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. +## Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc. ## This file is part of Red Hat elfutils. ## ## Red Hat elfutils is free software; you can redistribute it and/or modify @@ -49,7 +49,8 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \ eblsymboltypename.c ebldynamictagname.c eblsectionname.c \ eblobjecttypename.c eblsymbolbindingname.c \ eblbackendname.c eblshflagscombine.c eblwstrtab.c \ - eblgstrtab.c eblosabiname.c eblmachineflagcheck.c \ + eblgstrtab.c eblosabiname.c \ + eblmachineflagcheck.c eblmachinesectionflagcheck.c \ eblreloctypecheck.c eblrelocvaliduse.c eblrelocsimpletype.c \ ebldynamictagcheck.c eblcorenotetypename.c eblobjnotetypename.c \ eblcorenote.c eblobjnote.c ebldebugscnp.c \ diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h index 944e6404e..5344df094 100644 --- a/libebl/ebl-hooks.h +++ b/libebl/ebl-hooks.h @@ -1,5 +1,5 @@ /* Backend hook signatures internal interface for libebl. - 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. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -80,6 +80,9 @@ const char *EBLHOOK(machine_flag_name) (GElf_Word *); /* Check whether machine flags are valid. */ bool EBLHOOK(machine_flag_check) (GElf_Word); +/* Check whether SHF_MASKPROC flag bits are valid. */ +bool EBLHOOK(machine_section_flag_check) (GElf_Xword); + /* Return symbolic representation of symbol type. */ const char *EBLHOOK(symbol_type_name) (int, char *, size_t); diff --git a/libebl/eblmachinesectionflagcheck.c b/libebl/eblmachinesectionflagcheck.c new file mode 100644 index 000000000..9eb6d386f --- /dev/null +++ b/libebl/eblmachinesectionflagcheck.c @@ -0,0 +1,63 @@ +/* Check SHF_MASKPROC flags. + Copyright (C) 2007 Red Hat, Inc. + This file is part of Red Hat elfutils. + + Red Hat elfutils is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by the + Free Software Foundation; version 2 of the License. + + Red Hat elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Red Hat elfutils; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. + + In addition, as a special exception, Red Hat, Inc. gives You the + additional right to link the code of Red Hat elfutils with code licensed + under any Open Source Initiative certified open source license + (http://www.opensource.org/licenses/index.php) which requires the + distribution of source code with any binary distribution and to + distribute linked combinations of the two. Non-GPL Code permitted under + this exception must only link to the code of Red Hat elfutils through + those well defined interfaces identified in the file named EXCEPTION + found in the source code files (the "Approved Interfaces"). The files + of Non-GPL Code may instantiate templates or use macros or inline + functions from the Approved Interfaces without causing the resulting + work to be covered by the GNU General Public License. Only Red Hat, + Inc. may make changes or additions to the list of Approved Interfaces. + Red Hat's grant of this exception is conditioned upon your not adding + any new exceptions. If you wish to add a new Approved Interface or + exception, please contact Red Hat. You must obey the GNU General Public + License in all respects for all of the Red Hat elfutils code and other + code used in conjunction with Red Hat elfutils except the Non-GPL Code + covered by this exception. If you modify this file, you may extend this + exception to your version of the file, but you are not obligated to do + so. If you do not wish to provide this exception without modification, + you must delete this exception statement from your version and license + this file solely under the GPL without exception. + + Red Hat elfutils is an included package of the Open Invention Network. + An included package of the Open Invention Network is a package for which + Open Invention Network licensees cross-license their patents. No patent + license is granted, either expressly or impliedly, by designation as an + included package. Should you wish to participate in the Open Invention + Network licensing program, please visit www.openinventionnetwork.com + . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + + +bool +ebl_machine_section_flag_check (ebl, flags) + Ebl *ebl; + GElf_Xword flags; +{ + return ebl != NULL ? ebl->machine_section_flag_check (flags) : (flags == 0); +} diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c index dba22ba17..5b1a7193a 100644 --- a/libebl/eblopenbackend.c +++ b/libebl/eblopenbackend.c @@ -1,5 +1,5 @@ /* Generate ELF backend handle. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -171,6 +171,7 @@ static const char *default_section_name (int ignore, int ignore2, char *buf, size_t len); static const char *default_machine_flag_name (Elf64_Word *ignore); static bool default_machine_flag_check (Elf64_Word flags); +static bool default_machine_section_flag_check (GElf_Xword flags); static const char *default_symbol_type_name (int ignore, char *buf, size_t len); static const char *default_symbol_binding_name (int ignore, char *buf, @@ -221,6 +222,7 @@ fill_defaults (Ebl *result) result->section_name = default_section_name; result->machine_flag_name = default_machine_flag_name; result->machine_flag_check = default_machine_flag_check; + result->machine_section_flag_check = default_machine_section_flag_check; result->symbol_type_name = default_symbol_type_name; result->symbol_binding_name = default_symbol_binding_name; result->dynamic_tag_name = default_dynamic_tag_name; @@ -502,6 +504,12 @@ default_machine_flag_check (Elf64_Word flags __attribute__ ((unused))) return flags == 0; } +static bool +default_machine_section_flag_check (GElf_Xword flags) +{ + return flags == 0; +} + static const char * default_symbol_type_name (int ignore __attribute__ ((unused)), char *buf __attribute__ ((unused)), diff --git a/libebl/libebl.h b/libebl/libebl.h index 3375525d9..1465fb1aa 100644 --- a/libebl/libebl.h +++ b/libebl/libebl.h @@ -1,5 +1,5 @@ /* Interface for libebl. - 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. Red Hat elfutils is free software; you can redistribute it and/or modify @@ -138,6 +138,9 @@ extern const char *ebl_machine_flag_name (Ebl *ebl, GElf_Word flags, /* Check whether machine flag is valid. */ extern bool ebl_machine_flag_check (Ebl *ebl, GElf_Word flags); +/* Check whether SHF_MASKPROC flags are valid. */ +extern bool ebl_machine_section_flag_check (Ebl *ebl, GElf_Xword flags); + /* Return symbol type name. */ extern const char *ebl_symbol_type_name (Ebl *ebl, int symbol, char *buf, size_t len); diff --git a/libelf/ChangeLog b/libelf/ChangeLog index 14001c7a1..17985781b 100644 --- a/libelf/ChangeLog +++ b/libelf/ChangeLog @@ -8,6 +8,19 @@ * nlist.c: Close file descriptor before returning. +2007-01-20 Roland McGrath + + * gnuhash_xlate.h (elf_cvt_gnuhash): Fix fence-post error so we + convert the final word. + + * elf32_getshdr.c: Don't byteswap shdr fields when EI_DATA matches + MY_ELFDATA on !ALLOW_UNALIGNED machines. + +2007-01-18 Roland McGrath + + * gelf_rawchunk.c (gelf_rawchunk): Clear RESULT pointer after freeing + it on read error. + 2006-10-13 Roland McGrath * elf32_updatenull.c: Look for and accept phdr also for ET_CORE. diff --git a/libelf/elf32_getshdr.c b/libelf/elf32_getshdr.c index 4abd2c103..cafb1d4f1 100644 --- a/libelf/elf32_getshdr.c +++ b/libelf/elf32_getshdr.c @@ -1,5 +1,5 @@ /* Return section header. - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005 Red Hat, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper , 1998. @@ -105,7 +105,7 @@ elfw2(LIBELFBITS,getshdr) (scn) goto out; size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr)); - /* Allocate memory for the program headers. We know the number + /* Allocate memory for the section headers. We know the number of entries from the ELF header. */ ElfW2(LIBELFBITS,Shdr) *shdr = elf->state.ELFW(elf,LIBELFBITS).shdr = (ElfW2(LIBELFBITS,Shdr) *) malloc (size); @@ -122,41 +122,50 @@ elfw2(LIBELFBITS,getshdr) (scn) /* All the data is already mapped. If we could use it directly this would already have happened. */ + void *file_shdr = ((char *) elf->map_address + + elf->start_offset + ehdr->e_shoff); + assert (ehdr->e_ident[EI_DATA] != MY_ELFDATA || (! ALLOW_UNALIGNED - && (((uintptr_t) elf->map_address + elf->start_offset - + ehdr->e_shoff) + && ((uintptr_t) file_shdr & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0)); - /* Now copy the data and at the same time convert the byte - order. */ - if (ALLOW_UNALIGNED - || (((uintptr_t) elf->map_address + elf->start_offset - + ehdr->e_shoff) - & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) == 0) - notcvt = (ElfW2(LIBELFBITS,Shdr) *) - ((char *) elf->map_address - + elf->start_offset + ehdr->e_shoff); - else + /* Now copy the data and at the same time convert the byte order. */ + if (ehdr->e_ident[EI_DATA] == MY_ELFDATA) { - notcvt = (ElfW2(LIBELFBITS,Shdr) *) alloca (size); - memcpy (notcvt, ((char *) elf->map_address - + elf->start_offset + ehdr->e_shoff), - size); + assert (! ALLOW_UNALIGNED); + memcpy (shdr, file_shdr, size); } - - for (size_t cnt = 0; cnt < shnum; ++cnt) + else { - CONVERT_TO (shdr[cnt].sh_name, notcvt[cnt].sh_name); - CONVERT_TO (shdr[cnt].sh_type, notcvt[cnt].sh_type); - CONVERT_TO (shdr[cnt].sh_flags, notcvt[cnt].sh_flags); - CONVERT_TO (shdr[cnt].sh_addr, notcvt[cnt].sh_addr); - CONVERT_TO (shdr[cnt].sh_offset, notcvt[cnt].sh_offset); - CONVERT_TO (shdr[cnt].sh_size, notcvt[cnt].sh_size); - CONVERT_TO (shdr[cnt].sh_link, notcvt[cnt].sh_link); - CONVERT_TO (shdr[cnt].sh_info, notcvt[cnt].sh_info); - CONVERT_TO (shdr[cnt].sh_addralign, notcvt[cnt].sh_addralign); - CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize); + if (ALLOW_UNALIGNED + || ((uintptr_t) file_shdr + & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) == 0) + notcvt = (ElfW2(LIBELFBITS,Shdr) *) + ((char *) elf->map_address + + elf->start_offset + ehdr->e_shoff); + else + { + notcvt = (ElfW2(LIBELFBITS,Shdr) *) alloca (size); + memcpy (notcvt, ((char *) elf->map_address + + elf->start_offset + ehdr->e_shoff), + size); + } + + for (size_t cnt = 0; cnt < shnum; ++cnt) + { + CONVERT_TO (shdr[cnt].sh_name, notcvt[cnt].sh_name); + CONVERT_TO (shdr[cnt].sh_type, notcvt[cnt].sh_type); + CONVERT_TO (shdr[cnt].sh_flags, notcvt[cnt].sh_flags); + CONVERT_TO (shdr[cnt].sh_addr, notcvt[cnt].sh_addr); + CONVERT_TO (shdr[cnt].sh_offset, notcvt[cnt].sh_offset); + CONVERT_TO (shdr[cnt].sh_size, notcvt[cnt].sh_size); + CONVERT_TO (shdr[cnt].sh_link, notcvt[cnt].sh_link); + CONVERT_TO (shdr[cnt].sh_info, notcvt[cnt].sh_info); + CONVERT_TO (shdr[cnt].sh_addralign, + notcvt[cnt].sh_addralign); + CONVERT_TO (shdr[cnt].sh_entsize, notcvt[cnt].sh_entsize); + } } } else if (likely (elf->fildes != -1)) diff --git a/libelf/gelf_rawchunk.c b/libelf/gelf_rawchunk.c index cab07be53..ced6f9efe 100644 --- a/libelf/gelf_rawchunk.c +++ b/libelf/gelf_rawchunk.c @@ -1,5 +1,5 @@ /* Retrieve uninterpreted chunk of the file contents. - Copyright (C) 2002, 2005 Red Hat, Inc. + Copyright (C) 2002, 2005, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Contributed by Ulrich Drepper , 2002. @@ -101,6 +101,7 @@ gelf_rawchunk (elf, offset, size) /* Something went wrong. */ __libelf_seterrno (ELF_E_READ_ERROR); free (result); + result = NULL; } return result; diff --git a/libelf/gnuhash_xlate.h b/libelf/gnuhash_xlate.h index 9012ffa11..d79764d8c 100644 --- a/libelf/gnuhash_xlate.h +++ b/libelf/gnuhash_xlate.h @@ -1,5 +1,5 @@ /* Conversion functions for versioning information. - Copyright (C) 2006 Red Hat, Inc. + Copyright (C) 2006, 2007 Red Hat, Inc. This file is part of Red Hat elfutils. Written by Ulrich Drepper , 2006. @@ -87,7 +87,7 @@ elf_cvt_gnuhash (void *dest, const void *src, size_t len, int encode) /* The rest are 32 bit words again. */ src32 = (const Elf32_Word *) &src64[bitmask_words]; dest32 = (Elf32_Word *) &dest64[bitmask_words]; - while (len > 4) + while (len >= 4) { *dest32++ = bswap_32 (*src32++); len -= 4; diff --git a/src/ChangeLog b/src/ChangeLog index 6e619e0db..c2ce90fd6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2007-01-11 Roland McGrath + + * elflint.c (check_sections): Use ebl_machine_section_flag_check on + SHF_MASKPROC bits separately from generic sh_flags validation. + 2007-02-04 Ulrich Drepper * ar.c: New file. diff --git a/src/elflint.c b/src/elflint.c index 79e52299c..09c7fbd2f 100644 --- a/src/elflint.c +++ b/src/elflint.c @@ -3338,12 +3338,25 @@ section [%2zu] '%s': size not multiple of entry size\n"), #define ALL_SH_FLAGS (SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR | SHF_MERGE \ | SHF_STRINGS | SHF_INFO_LINK | SHF_LINK_ORDER \ | SHF_OS_NONCONFORMING | SHF_GROUP | SHF_TLS) - if (shdr->sh_flags & ~ALL_SH_FLAGS) - ERROR (gettext ("section [%2zu] '%s' contains unknown flag(s)" - " %#" PRIx64 "\n"), - cnt, section_name (ebl, cnt), - (uint64_t) shdr->sh_flags & ~(uint64_t) ALL_SH_FLAGS); - else if (shdr->sh_flags & SHF_TLS) + if (shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS) + { + GElf_Xword sh_flags = shdr->sh_flags & ~(GElf_Xword) ALL_SH_FLAGS; + if (sh_flags & SHF_MASKPROC) + { + if (!ebl_machine_section_flag_check (ebl, + sh_flags & SHF_MASKPROC)) + ERROR (gettext ("section [%2zu] '%s'" + " contains invalid processor-specific flag(s)" + " %#" PRIx64 "\n"), + cnt, section_name (ebl, cnt), sh_flags & SHF_MASKPROC); + sh_flags &= ~(GElf_Xword) SHF_MASKPROC; + } + if (sh_flags != 0) + ERROR (gettext ("section [%2zu] '%s' contains unknown flag(s)" + " %#" PRIx64 "\n"), + cnt, section_name (ebl, cnt), sh_flags); + } + if (shdr->sh_flags & SHF_TLS) { // XXX Correct? if (shdr->sh_addr != 0 && !gnuld) diff --git a/tests/ChangeLog b/tests/ChangeLog index 2aaba2faa..5b188f845 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,26 @@ +2007-02-02 Roland McGrath + + * run-addrname-test.sh: New file. + * Makefile.am (TESTS, EXTRA_DIST): Add it. + * testfile34.bz2: New data file. + * Makefile.am (EXTRA_DIST): Add it. + +2007-01-20 Roland McGrath + + * testfile33.bz2: New data file. + * Makefile.am (EXTRA_DIST): Add it. + * run-elflint-test.sh: Test on it too. + +2007-01-18 Roland McGrath + + * Makefile.am (CFLAGS): Don't molest it. + +2007-01-11 Roland McGrath + + * testfile32.bz2: New data file. + * Makefile.am (EXTRA_DIST): Add it. + * run-elflint-test.sh: Test on it too. + 2007-02-04 Ulrich Drepper * arls.c: New file. diff --git a/tests/Makefile.am b/tests/Makefile.am index bd56f7b7a..bff5568b5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -34,7 +34,6 @@ AM_CFLAGS = -Wall -Werror -Wextra -std=gnu99 \ $(if $($(*F)_no_Wformat),-Wno-format,-Wformat=2) BUILT_RPATH = \$$ORIGIN/../libasm:\$$ORIGIN/../libdw:\$$ORIGIN/../backends:\$$ORIGIN/../libelf endif -CFLAGS := $(filter-out -Wall,$(CFLAGS)) AM_LDFLAGS = @@ -77,7 +76,7 @@ TESTS = run-arextract.sh run-arsymtest.sh newfile test-nlist \ run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ run-find-prologues.sh run-allregs.sh run-readelf-test1.sh \ run-native-test.sh run-bug1-test.sh \ - dwfl-bug-addr-overflow + dwfl-bug-addr-overflow run-addrname-test.sh # run-show-ciefde.sh if !STANDALONE @@ -106,6 +105,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ run-ranlib-test3.sh run-ranlib-test4.sh \ run-addrscopes.sh run-strings-test.sh run-funcscopes.sh \ run-find-prologues.sh run-allregs.sh run-native-test.sh \ + run-addrname-test.sh \ testfile15.bz2 testfile15.debug.bz2 \ testfile16.bz2 testfile16.debug.bz2 \ testfile17.bz2 testfile17.debug.bz2 \ @@ -117,7 +117,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ coverage.sh test-subr.sh test-wrapper.sh run-readelf-test1.sh \ run-bug1-test.sh testfile28.bz2 testfile28.rdwr.bz2 \ testfile29.bz2 testfile29.rdwr.bz2 \ - testfile30.bz2 testfile31.bz2 + testfile30.bz2 testfile31.bz2 testfile32.bz2 testfile33.bz2 \ + testfile34.bz2 installed_TESTS_ENVIRONMENT = libdir=$(DESTDIR)$(libdir) \ bindir=$(DESTDIR)$(bindir) \ diff --git a/tests/run-addrname-test.sh b/tests/run-addrname-test.sh new file mode 100755 index 000000000..6469646c1 --- /dev/null +++ b/tests/run-addrname-test.sh @@ -0,0 +1,47 @@ +#! /bin/sh +# Copyright (C) 2007 Red Hat, Inc. +# This file is part of Red Hat elfutils. +# +# Red Hat elfutils is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by the +# Free Software Foundation; version 2 of the License. +# +# Red Hat elfutils is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with Red Hat elfutils; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. +# +# Red Hat elfutils is an included package of the Open Invention Network. +# An included package of the Open Invention Network is a package for which +# Open Invention Network licensees cross-license their patents. No patent +# license is granted, either expressly or impliedly, by designation as an +# included package. Should you wish to participate in the Open Invention +# Network licensing program, please visit www.openinventionnetwork.com +# . + +. $srcdir/test-subr.sh + +testfiles testfile34 + +testrun_compare ../src/addr2line -f -e testfile34 \ + 0x08048074 0x08048075 0x08048076 \ + 0x08049078 0x08048080 0x08049080 <<\EOF +foo +??:0 +bar +??:0 +_etext +??:0 +data1 +??:0 +?? +??:0 +_end +??:0 +EOF + +exit 0 diff --git a/tests/run-elflint-test.sh b/tests/run-elflint-test.sh index 021802042..660f10703 100755 --- a/tests/run-elflint-test.sh +++ b/tests/run-elflint-test.sh @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2005 Red Hat, Inc. +# Copyright (C) 2005, 2007 Red Hat, Inc. # This file is part of Red Hat elfutils. # Written by Ulrich Drepper , 2005. # @@ -32,4 +32,10 @@ testrun_compare ../src/elflint --gnu-ld testfile18 <<\EOF section [ 8] '.rela.dyn': relocation 1: copy relocation against symbol of type FUNC EOF +testfiles testfile32 +testrun ../src/elflint -q testfile32 + +testfiles testfile33 +testrun ../src/elflint -q testfile33 + exit 0 diff --git a/tests/testfile32.bz2 b/tests/testfile32.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7e3c73e6be8ba45f45805b14d1b00066afeccbc0 GIT binary patch literal 5778 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