diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 93c7d0833f..bc991f32c7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +Thu Jan 11 17:06:14 1996 Michael Meissner + + * section.c (SEC_{EXCLUDE,SORT_ENTRIES}): New section flags for + PowerPC V.4 and eabi. + * bfd-in2.h: Regenerate. + * libfd.h: Regenerate. + + * elfxx-target.h (TARGET_{BIG,LITTLE}_SYM): Add new flags. + + * elf32-ppc.c (ppc_elf_section_from_shdr): Support SHT_ORDERED + section type and SHF_EXCLUDE section flag, turning them into the + appropriate bfd section flag. + Thu Jan 11 11:23:30 1996 Ian Lance Taylor * elf32-mips.c: Extensive changes for a start at dynamic linking diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index d5821fc24b..df18497666 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1,5 +1,5 @@ /* Main header file for the bfd library -- portable access to object files. - Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. Contributed by Cygnus Support. ** NOTE: bfd.h and bfd-in2.h are GENERATED files. Don't change them; @@ -874,6 +874,16 @@ typedef struct sec memory if appropriate. */ #define SEC_IN_MEMORY 0x20000 + /* The contents of this section are to be excluded by the + linker for executable and shared objects unless those + objects are to be further relocated. */ +#define SEC_EXCLUDE 0x40000 + + /* The contents of this section are to be sorted by the + based on the address specified in the associated symbol + table. */ +#define SEC_SORT_ENTRIES 0x80000 + /* End of section flags. */ /* The virtual memory address of the section - where it will be diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 201d1bb0d0..0f6126d378 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -113,6 +113,10 @@ static boolean ppc_elf_set_private_flags PARAMS ((bfd *, flagword)); static boolean ppc_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *)); static boolean ppc_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *)); +static boolean ppc_elf_section_from_shdr PARAMS ((bfd *, + Elf32_Internal_Shdr *, + char *)); + static boolean ppc_elf_check_relocs PARAMS ((bfd *, struct bfd_link_info *, asection *, @@ -1127,6 +1131,34 @@ ppc_elf_unsupported_reloc (abfd, reloc_entry, symbol, data, input_section, return bfd_reloc_notsupported; } + +/* Handle a PowerPC specific section when reading an object file. This + is called when elfcode.h finds a section with an unknown type. */ + +static boolean +ppc_elf_section_from_shdr (abfd, hdr, name) + bfd *abfd; + Elf32_Internal_Shdr *hdr; + char *name; +{ + asection *newsect; + flagword flags; + + if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name)) + return false; + + newsect = hdr->bfd_section; + flags = bfd_get_section_flags (abfd, newsect); + if (hdr->sh_flags & SHF_EXCLUDE) + flags |= SEC_EXCLUDE; + + if (hdr->sh_type == SHT_ORDERED) + flags |= SEC_SORT_ENTRIES; + + bfd_set_section_flags (abfd, newsect, flags); + return true; +} + /* Adjust a symbol defined by a dynamic object and referenced by a regular object. The current definition is in some section of the @@ -2290,6 +2322,7 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section, #define bfd_elf32_bfd_merge_private_bfd_data ppc_elf_merge_private_bfd_data #define bfd_elf32_bfd_set_private_flags ppc_elf_set_private_flags #define bfd_elf32_bfd_reloc_type_lookup ppc_elf_reloc_type_lookup +#define elf_backend_section_from_shdr ppc_elf_section_from_shdr #define elf_backend_relocate_section ppc_elf_relocate_section #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections #define elf_backend_check_relocs ppc_elf_check_relocs diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 989a1dc4bf..f1573f4b0a 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -303,7 +303,7 @@ const bfd_target TARGET_BIG_SYM = /* section_flags: mask of all section flags */ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | - SEC_CODE | SEC_DATA | SEC_DEBUGGING), + SEC_CODE | SEC_DATA | SEC_DEBUGGING | SEC_EXCLUDE | SEC_SORT_ENTRIES), /* leading_symbol_char: is the first char of a user symbol predictable, and if so what is it */ @@ -387,7 +387,7 @@ const bfd_target TARGET_LITTLE_SYM = /* section_flags: mask of all section flags */ (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | - SEC_CODE | SEC_DATA | SEC_DEBUGGING), + SEC_CODE | SEC_DATA | SEC_DEBUGGING | SEC_EXCLUDE | SEC_SORT_ENTRIES), /* leading_symbol_char: is the first char of a user symbol predictable, and if so what is it */ diff --git a/bfd/libbfd.h b/bfd/libbfd.h index dc22c64942..49fb97149b 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -1,6 +1,6 @@ /* libbfd.h -- Declarations used by bfd library *implementation*. (This include file is not for users of the library.) - Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. Written by Cygnus Support. ** NOTE: libbfd.h is a GENERATED file. Don't change it; instead, diff --git a/bfd/section.c b/bfd/section.c index e9fbcf9083..2f280c5958 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -1,5 +1,5 @@ /* Object file "section" support for the BFD library. - Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. + Copyright (C) 1990, 1991, 1992, 1993, 1996 Free Software Foundation, Inc. Written by Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -16,7 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* SECTION @@ -226,19 +226,25 @@ CODE_FRAGMENT .#define SEC_HAS_CONTENTS 0x200 . . {* An instruction to the linker to not output the section -. even if it has information which would normally be written. *} +. even if it has information which would normally be written. *} .#define SEC_NEVER_LOAD 0x400 . -. {* The section is a shared library section. The linker must leave -. these completely alone, as the vma and size are used when -. the executable is loaded. *} -.#define SEC_SHARED_LIBRARY 0x800 +. {* The section is a COFF shared library section. This flag is +. only for the linker. If this type of section appears in +. the input file, the linker must copy it to the output file +. without changing the vma or size. FIXME: Although this +. was originally intended to be general, it really is COFF +. specific (and the flag was renamed to indicate this). It +. might be cleaner to have some more general mechanism to +. allow the back end to control what the linker does with +. sections. *} +.#define SEC_COFF_SHARED_LIBRARY 0x800 . . {* The section is a common section (symbols may be defined . multiple times, the value of a symbol is the amount of . space it requires, and the largest symbol value is the one . used). Most targets have exactly one of these (which we -. translate to bfd_com_section), but ECOFF has two. *} +. translate to bfd_com_section_ptr), but ECOFF has two. *} .#define SEC_IS_COMMON 0x8000 . . {* The section contains only debugging information. For @@ -253,6 +259,16 @@ CODE_FRAGMENT . memory if appropriate. *} .#define SEC_IN_MEMORY 0x20000 . +. {* The contents of this section are to be excluded by the +. linker for executable and shared objects unless those +. objects are to be further relocated. *} +.#define SEC_EXCLUDE 0x40000 +. +. {* The contents of this section are to be sorted by the +. based on the address specified in the associated symbol +. table. *} +.#define SEC_SORT_ENTRIES 0x80000 +. . {* End of section flags. *} . . {* The virtual memory address of the section - where it will be @@ -373,28 +389,36 @@ CODE_FRAGMENT . struct bfd_link_order *link_order_tail; .} asection ; . -. . {* These sections are global, and are managed by BFD. The application . and target back end are not permitted to change the values in -. these sections. *} +. these sections. New code should use the section_ptr macros rather +. than referring directly to the const sections. The const sections +. may eventually vanish. *} .#define BFD_ABS_SECTION_NAME "*ABS*" .#define BFD_UND_SECTION_NAME "*UND*" .#define BFD_COM_SECTION_NAME "*COM*" .#define BFD_IND_SECTION_NAME "*IND*" . . {* the absolute section *} -.extern asection bfd_abs_section; +.extern const asection bfd_abs_section; +.#define bfd_abs_section_ptr ((asection *) &bfd_abs_section) +.#define bfd_is_abs_section(sec) ((sec) == bfd_abs_section_ptr) . {* Pointer to the undefined section *} -.extern asection bfd_und_section; +.extern const asection bfd_und_section; +.#define bfd_und_section_ptr ((asection *) &bfd_und_section) +.#define bfd_is_und_section(sec) ((sec) == bfd_und_section_ptr) . {* Pointer to the common section *} -.extern asection bfd_com_section; +.extern const asection bfd_com_section; +.#define bfd_com_section_ptr ((asection *) &bfd_com_section) . {* Pointer to the indirect section *} -.extern asection bfd_ind_section; +.extern const asection bfd_ind_section; +.#define bfd_ind_section_ptr ((asection *) &bfd_ind_section) +.#define bfd_is_ind_section(sec) ((sec) == bfd_ind_section_ptr) . -.extern struct symbol_cache_entry *bfd_abs_symbol; -.extern struct symbol_cache_entry *bfd_com_symbol; -.extern struct symbol_cache_entry *bfd_und_symbol; -.extern struct symbol_cache_entry *bfd_ind_symbol; +.extern const struct symbol_cache_entry * const bfd_abs_symbol; +.extern const struct symbol_cache_entry * const bfd_com_symbol; +.extern const struct symbol_cache_entry * const bfd_und_symbol; +.extern const struct symbol_cache_entry * const bfd_ind_symbol; .#define bfd_get_section_size_before_reloc(section) \ . (section->reloc_done ? (abort(),1): (section)->_raw_size) .#define bfd_get_section_size_after_reloc(section) \ @@ -403,22 +427,24 @@ CODE_FRAGMENT /* These symbols are global, not specific to any BFD. Therefore, anything that tries to change them is broken, and should be repaired. */ -static CONST asymbol global_syms[] = +static const asymbol global_syms[] = { /* the_bfd, name, value, attr, section [, udata] */ - {0, BFD_COM_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_com_section}, - {0, BFD_UND_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_und_section}, - {0, BFD_ABS_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_abs_section}, - {0, BFD_IND_SECTION_NAME, 0, BSF_SECTION_SYM, &bfd_ind_section}, + {0, BFD_COM_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_com_section}, + {0, BFD_UND_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_und_section}, + {0, BFD_ABS_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_abs_section}, + {0, BFD_IND_SECTION_NAME, 0, BSF_SECTION_SYM, (asection *) &bfd_ind_section}, }; #define STD_SECTION(SEC, FLAGS, SYM, NAME, IDX) \ - asymbol *SYM = (asymbol *) &global_syms[IDX]; \ - asection SEC = { NAME, 0, 0, FLAGS, 0, 0, (boolean) 0, 0, 0, 0, &SEC,\ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (boolean) 0, \ - (asymbol *) &global_syms[IDX], &SYM, } + const asymbol * const SYM = (asymbol *) &global_syms[IDX]; \ + const asection SEC = \ + { NAME, 0, 0, FLAGS, 0, false, 0, 0, 0, 0, (asection *) &SEC, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (boolean) 0, \ + (asymbol *) &global_syms[IDX], (asymbol **) &SYM, } -STD_SECTION (bfd_com_section, SEC_IS_COMMON, bfd_com_symbol, BFD_COM_SECTION_NAME, 0); +STD_SECTION (bfd_com_section, SEC_IS_COMMON, bfd_com_symbol, + BFD_COM_SECTION_NAME, 0); STD_SECTION (bfd_und_section, 0, bfd_und_symbol, BFD_UND_SECTION_NAME, 1); STD_SECTION (bfd_abs_section, 0, bfd_abs_symbol, BFD_ABS_SECTION_NAME, 2); STD_SECTION (bfd_ind_section, 0, bfd_ind_symbol, BFD_IND_SECTION_NAME, 3); @@ -545,10 +571,7 @@ bfd_make_section_anyway (abfd, name) newsect = (asection *) bfd_zalloc (abfd, sizeof (asection)); if (newsect == NULL) - { - bfd_set_error (bfd_error_no_memory); - return NULL; - } + return NULL; newsect->name = name; newsect->index = abfd->section_count++; @@ -566,7 +589,7 @@ bfd_make_section_anyway (abfd, name) useful for things like relocs which are relative to the base of a section. */ newsect->symbol = bfd_make_empty_symbol (abfd); - if (!newsect) + if (newsect->symbol == NULL) return NULL; newsect->symbol->name = name; newsect->symbol->value = 0; @@ -599,7 +622,7 @@ DESCRIPTION <>. */ -sec_ptr +asection * bfd_make_section (abfd, name) bfd *abfd; CONST char *name; @@ -608,20 +631,20 @@ bfd_make_section (abfd, name) if (strcmp (name, BFD_ABS_SECTION_NAME) == 0) { - return &bfd_abs_section; + return bfd_abs_section_ptr; } if (strcmp (name, BFD_COM_SECTION_NAME) == 0) { - return &bfd_com_section; + return bfd_com_section_ptr; } if (strcmp (name, BFD_UND_SECTION_NAME) == 0) { - return &bfd_und_section; + return bfd_und_section_ptr; } if (strcmp (name, BFD_IND_SECTION_NAME) == 0) { - return &bfd_ind_section; + return bfd_ind_section_ptr; } while (sect) @@ -716,7 +739,7 @@ bfd_map_over_sections (abfd, operation, user_storage) PTR user_storage; { asection *sect; - int i = 0; + unsigned int i = 0; for (sect = abfd->sections; sect != NULL; i++, sect = sect->next) (*operation) (abfd, sect, user_storage); @@ -813,7 +836,7 @@ bfd_set_section_contents (abfd, section, location, offset, count) { bfd_size_type sz; - if (!bfd_get_section_flags (abfd, section) & SEC_HAS_CONTENTS) + if (!(bfd_get_section_flags (abfd, section) & SEC_HAS_CONTENTS)) { bfd_set_error (bfd_error_no_contents); return (false); @@ -826,7 +849,7 @@ bfd_set_section_contents (abfd, section, location, offset, count) return false; } sz = bfd_get_section_size_now (abfd, section); - if (offset > sz + if ((bfd_size_type) offset > sz || count > sz || offset + count > sz) goto bad_val; @@ -908,7 +931,7 @@ bfd_get_section_contents (abfd, section, location, offset, count) /* Even if reloc_done is true, this function reads unrelocated contents, so we want the raw size. */ sz = section->_raw_size; - if (offset > sz || count > sz || offset + count > sz) + if ((bfd_size_type) offset > sz || count > sz || offset + count > sz) goto bad_val; if (count == 0) @@ -923,10 +946,31 @@ bfd_get_section_contents (abfd, section, location, offset, count) if ((section->flags & SEC_IN_MEMORY) != 0) { - memcpy (location, section->contents + offset, count); + memcpy (location, section->contents + offset, (size_t) count); return true; } return BFD_SEND (abfd, _bfd_get_section_contents, (abfd, section, location, offset, count)); } + +/* +FUNCTION + bfd_copy_private_section_data + +SYNOPSIS + boolean bfd_copy_private_section_data(bfd *ibfd, asection *isec, bfd *obfd, asection *osec); + +DESCRIPTION + Copy private section information from @var{isec} in the BFD + @var{ibfd} to the section @var{osec} in the BFD @var{obfd}. + Return <> on success, <> on error. Possible error + returns are: + + o <> - + Not enough memory exists to create private data for @var{osec}. + +.#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ +. BFD_SEND (ibfd, _bfd_copy_private_section_data, \ +. (ibfd, isection, obfd, osection)) +*/ diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 1d5f6b9935..a0a2cf5605 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +Thu Jan 11 17:31:38 1996 Michael Meissner + + * objdump.c (dump_section_header): Add new section flags + SEC_{EXCLUDE,SORT_ENTRIES}. + Thu Jan 11 11:45:34 1996 Ian Lance Taylor * objcopy.c (filter_symbols): NULL terminate the output symbols. diff --git a/binutils/objdump.c b/binutils/objdump.c index b419346bb1..00b71a7939 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -220,6 +220,8 @@ dump_section_header (abfd, section, ignored) PF (SEC_ROM, "ROM"); PF (SEC_DEBUGGING, "DEBUGGING"); PF (SEC_NEVER_LOAD, "NEVER_LOAD"); + PF (SEC_EXCLUDE, "EXCLUDE"); + PF (SEC_SORT_ENTRIES, "SORT ENTRIES"); printf ("\n"); #undef PF } @@ -1294,7 +1296,7 @@ display_bfd (abfd) putchar ('\n'); if (dump_section_headers) dump_headers (abfd); - if (dump_symtab || dump_reloc_info || disassemble) + if (dump_symtab || dump_reloc_info || disassemble || dump_debugging) { syms = slurp_symtab (abfd); } @@ -1320,7 +1322,7 @@ display_bfd (abfd) { PTR dhandle; - dhandle = read_debugging_info (abfd); + dhandle = read_debugging_info (abfd, syms, symcount); if (dhandle != NULL) { if (! print_debugging_info (stdout, dhandle))