diff options
-rw-r--r-- | binutils/ChangeLog | 11 | ||||
-rw-r--r-- | binutils/readelf.c | 229 |
2 files changed, 128 insertions, 112 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 1bd3b9b..d2c4208 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,14 @@ +2002-12-07 Alan Modra <amodra@bigpond.net.au> + + * readelf.c (process_program_headers): When setting loadaddr, don't + assume segment size is 4k. Use p_align instead. + (loadaddr): Change from int to long. + (dynamic_addr, dynamic_info, version_info): Likewise. + (process_dynamic_segment <syminsz>): Likewise. + (process_dynamic_segment): Adjust print format string. + (rela_addr, rela_size): Delete. + (process_relocs): Formatting. + 2002-12-05 Jim Wilson <wilson@redhat.com> * configure.in (OBJDUMP_DEFS): Define SKIP_ZEROES as 16 for IA-64. diff --git a/binutils/readelf.c b/binutils/readelf.c index ca996ac..6a5732a 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -90,10 +90,8 @@ #include "getopt.h" char *program_name = "readelf"; -unsigned int dynamic_addr; +unsigned long dynamic_addr; bfd_size_type dynamic_size; -unsigned int rela_addr; -unsigned int rela_size; char *dynamic_strings; char *string_table; unsigned long string_table_length; @@ -103,9 +101,9 @@ Elf_Internal_Syminfo *dynamic_syminfo; unsigned long dynamic_syminfo_offset; unsigned int dynamic_syminfo_nent; char program_interpreter[64]; -int dynamic_info[DT_JMPREL + 1]; -int version_info[16]; -int loadaddr = 0; +long dynamic_info[DT_JMPREL + 1]; +long version_info[16]; +long loadaddr = 0; Elf_Internal_Ehdr elf_header; Elf_Internal_Shdr *section_headers; Elf_Internal_Dyn *dynamic_segment; @@ -160,222 +158,222 @@ typedef enum print_mode print_mode; /* Forward declarations for dumb compilers. */ -static void print_vma +static void print_vma PARAMS ((bfd_vma, print_mode)); -static void print_symbol +static void print_symbol PARAMS ((int, const char *)); -static bfd_vma (*byte_get) +static bfd_vma (*byte_get) PARAMS ((unsigned char *, int)); -static bfd_vma byte_get_little_endian +static bfd_vma byte_get_little_endian PARAMS ((unsigned char *, int)); -static bfd_vma byte_get_big_endian +static bfd_vma byte_get_big_endian PARAMS ((unsigned char *, int)); -static const char *get_mips_dynamic_type +static const char *get_mips_dynamic_type PARAMS ((unsigned long)); -static const char *get_sparc64_dynamic_type +static const char *get_sparc64_dynamic_type PARAMS ((unsigned long)); -static const char *get_ppc64_dynamic_type +static const char *get_ppc64_dynamic_type PARAMS ((unsigned long)); -static const char *get_parisc_dynamic_type +static const char *get_parisc_dynamic_type PARAMS ((unsigned long)); -static const char *get_dynamic_type +static const char *get_dynamic_type PARAMS ((unsigned long)); -static int slurp_rela_relocs +static int slurp_rela_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *)); -static int slurp_rel_relocs +static int slurp_rel_relocs PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Rela **, unsigned long *)); -static int dump_relocations +static int dump_relocations PARAMS ((FILE *, unsigned long, unsigned long, Elf_Internal_Sym *, unsigned long, char *, int)); -static char *get_file_type +static char *get_file_type PARAMS ((unsigned)); -static char *get_machine_name +static char *get_machine_name PARAMS ((unsigned)); -static void decode_ARM_machine_flags +static void decode_ARM_machine_flags PARAMS ((unsigned, char[])); -static char *get_machine_flags +static char *get_machine_flags PARAMS ((unsigned, unsigned)); -static const char *get_mips_segment_type +static const char *get_mips_segment_type PARAMS ((unsigned long)); -static const char *get_parisc_segment_type +static const char *get_parisc_segment_type PARAMS ((unsigned long)); -static const char *get_ia64_segment_type +static const char *get_ia64_segment_type PARAMS ((unsigned long)); -static const char *get_segment_type +static const char *get_segment_type PARAMS ((unsigned long)); -static const char *get_mips_section_type_name +static const char *get_mips_section_type_name PARAMS ((unsigned int)); static const char *get_parisc_section_type_name PARAMS ((unsigned int)); -static const char *get_ia64_section_type_name +static const char *get_ia64_section_type_name PARAMS ((unsigned int)); -static const char *get_section_type_name +static const char *get_section_type_name PARAMS ((unsigned int)); -static const char *get_symbol_binding +static const char *get_symbol_binding PARAMS ((unsigned int)); -static const char *get_symbol_type +static const char *get_symbol_type PARAMS ((unsigned int)); -static const char *get_symbol_visibility +static const char *get_symbol_visibility PARAMS ((unsigned int)); -static const char *get_symbol_index_type +static const char *get_symbol_index_type PARAMS ((unsigned int)); -static const char *get_dynamic_flags +static const char *get_dynamic_flags PARAMS ((bfd_vma)); -static void usage +static void usage PARAMS ((void)); -static void parse_args +static void parse_args PARAMS ((int, char **)); -static int process_file_header +static int process_file_header PARAMS ((void)); -static int process_program_headers +static int process_program_headers PARAMS ((FILE *)); -static int process_section_headers +static int process_section_headers PARAMS ((FILE *)); -static int process_unwind +static int process_unwind PARAMS ((FILE *)); -static void dynamic_segment_mips_val +static void dynamic_segment_mips_val PARAMS ((Elf_Internal_Dyn *)); -static void dynamic_segment_parisc_val +static void dynamic_segment_parisc_val PARAMS ((Elf_Internal_Dyn *)); -static int process_dynamic_segment +static int process_dynamic_segment PARAMS ((FILE *)); -static int process_symbol_table +static int process_symbol_table PARAMS ((FILE *)); -static int process_syminfo +static int process_syminfo PARAMS ((FILE *)); -static int process_section_contents +static int process_section_contents PARAMS ((FILE *)); -static void process_mips_fpe_exception +static void process_mips_fpe_exception PARAMS ((int)); -static int process_mips_specific +static int process_mips_specific PARAMS ((FILE *)); -static int process_file +static int process_file PARAMS ((char *)); -static int process_relocs +static int process_relocs PARAMS ((FILE *)); -static int process_version_sections +static int process_version_sections PARAMS ((FILE *)); -static char *get_ver_flags +static char *get_ver_flags PARAMS ((unsigned int)); -static int get_32bit_section_headers +static int get_32bit_section_headers PARAMS ((FILE *, unsigned int)); -static int get_64bit_section_headers +static int get_64bit_section_headers PARAMS ((FILE *, unsigned int)); -static int get_32bit_program_headers +static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *)); -static int get_64bit_program_headers +static int get_64bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *)); -static int get_file_header +static int get_file_header PARAMS ((FILE *)); -static Elf_Internal_Sym *get_32bit_elf_symbols +static Elf_Internal_Sym *get_32bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *)); -static Elf_Internal_Sym *get_64bit_elf_symbols +static Elf_Internal_Sym *get_64bit_elf_symbols PARAMS ((FILE *, Elf_Internal_Shdr *)); -static const char *get_elf_section_flags +static const char *get_elf_section_flags PARAMS ((bfd_vma)); -static int *get_dynamic_data +static int *get_dynamic_data PARAMS ((FILE *, unsigned int)); -static int get_32bit_dynamic_segment +static int get_32bit_dynamic_segment PARAMS ((FILE *)); -static int get_64bit_dynamic_segment +static int get_64bit_dynamic_segment PARAMS ((FILE *)); #ifdef SUPPORT_DISASSEMBLY -static int disassemble_section +static int disassemble_section PARAMS ((Elf_Internal_Shdr *, FILE *)); #endif -static int dump_section +static int dump_section PARAMS ((Elf_Internal_Shdr *, FILE *)); -static int display_debug_section +static int display_debug_section PARAMS ((Elf_Internal_Shdr *, FILE *)); -static int display_debug_info +static int display_debug_info PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); static int display_debug_not_supported PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int prescan_debug_info +static int prescan_debug_info PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_lines +static int display_debug_lines PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_pubnames +static int display_debug_pubnames PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_abbrev +static int display_debug_abbrev PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_aranges +static int display_debug_aranges PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_frames +static int display_debug_frames PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_macinfo +static int display_debug_macinfo PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_str +static int display_debug_str PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static int display_debug_loc +static int display_debug_loc PARAMS ((Elf_Internal_Shdr *, unsigned char *, FILE *)); -static unsigned char *process_abbrev_section +static unsigned char *process_abbrev_section PARAMS ((unsigned char *, unsigned char *)); -static void load_debug_str +static void load_debug_str PARAMS ((FILE *)); -static void free_debug_str +static void free_debug_str PARAMS ((void)); -static const char *fetch_indirect_string +static const char *fetch_indirect_string PARAMS ((unsigned long)); -static void load_debug_loc +static void load_debug_loc PARAMS ((FILE *)); -static void free_debug_loc +static void free_debug_loc PARAMS ((void)); -static unsigned long read_leb128 +static unsigned long read_leb128 PARAMS ((unsigned char *, int *, int)); -static int process_extended_line_op +static int process_extended_line_op PARAMS ((unsigned char *, int, int)); -static void reset_state_machine +static void reset_state_machine PARAMS ((int)); -static char *get_TAG_name +static char *get_TAG_name PARAMS ((unsigned long)); -static char *get_AT_name +static char *get_AT_name PARAMS ((unsigned long)); -static char *get_FORM_name +static char *get_FORM_name PARAMS ((unsigned long)); -static void free_abbrevs +static void free_abbrevs PARAMS ((void)); -static void add_abbrev +static void add_abbrev PARAMS ((unsigned long, unsigned long, int)); -static void add_abbrev_attr +static void add_abbrev_attr PARAMS ((unsigned long, unsigned long)); -static unsigned char *read_and_display_attr +static unsigned char *read_and_display_attr PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long)); static unsigned char *read_and_display_attr_value PARAMS ((unsigned long, unsigned long, unsigned char *, unsigned long, unsigned long)); -static unsigned char *display_block +static unsigned char *display_block PARAMS ((unsigned char *, unsigned long)); -static void decode_location_expression +static void decode_location_expression PARAMS ((unsigned char *, unsigned int, unsigned long)); -static void request_dump +static void request_dump PARAMS ((unsigned int, int)); -static const char *get_elf_class +static const char *get_elf_class PARAMS ((unsigned int)); -static const char *get_data_encoding +static const char *get_data_encoding PARAMS ((unsigned int)); -static const char *get_osabi_name +static const char *get_osabi_name PARAMS ((unsigned int)); -static int guess_is_rela +static int guess_is_rela PARAMS ((unsigned long)); -static const char *get_note_type +static const char *get_note_type PARAMS ((unsigned int)); -static const char *get_netbsd_elfcore_note_type +static const char *get_netbsd_elfcore_note_type PARAMS ((unsigned int)); -static int process_note +static int process_note PARAMS ((Elf_Internal_Note *)); -static int process_corefile_note_segment +static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma)); static int process_corefile_note_segments PARAMS ((FILE *)); -static int process_corefile_contents +static int process_corefile_contents PARAMS ((FILE *)); -static int process_arch_specific +static int process_arch_specific PARAMS ((FILE *)); -static int process_gnu_liblist +static int process_gnu_liblist PARAMS ((FILE *)); typedef int Elf32_Word; @@ -3142,8 +3140,14 @@ process_program_headers (file) { case PT_LOAD: if (loadaddr == -1) - loadaddr = (segment->p_vaddr & 0xfffff000) - - (segment->p_offset & 0xfffff000); + { + unsigned long align_mask = -segment->p_align; + + if (align_mask == 0) + --align_mask; + loadaddr = ((segment->p_vaddr & align_mask) + - (segment->p_offset & align_mask)); + } break; case PT_DYNAMIC: @@ -3787,7 +3791,8 @@ process_relocs (file) rel_offset, rel_size); dump_relocations (file, rel_offset - loadaddr, rel_size, - dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela); + dynamic_symbols, num_dynamic_syms, dynamic_strings, + is_rela); } else printf (_("\nThere are no dynamic relocations in this file.\n")); @@ -4653,7 +4658,7 @@ process_dynamic_segment (file) /* And find the syminfo section if available. */ if (dynamic_syminfo == NULL) { - unsigned int syminsz = 0; + unsigned long syminsz = 0; for (i = 0, entry = dynamic_segment; i < dynamic_size; @@ -4703,7 +4708,7 @@ process_dynamic_segment (file) } if (do_dynamic && dynamic_addr) - printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"), + printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"), dynamic_addr, (long) dynamic_size); if (do_dynamic) printf (_(" Tag Type Name/Value\n")); |