Add support for SHT_ORDERED and SHF_EXCLUDE

This commit is contained in:
Michael Meissner 1996-01-11 22:47:04 +00:00
parent 053baeb156
commit 83f4323e5a
8 changed files with 156 additions and 49 deletions

View File

@ -1,3 +1,16 @@
Thu Jan 11 17:06:14 1996 Michael Meissner <meissner@tiktok.cygnus.com>
* 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 <ian@cygnus.com>
* elf32-mips.c: Extensive changes for a start at dynamic linking

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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,

View File

@ -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
<<bfd_error>>.
*/
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 <<true>> on success, <<false>> on error. Possible error
returns are:
o <<bfd_error_no_memory>> -
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))
*/

View File

@ -1,3 +1,8 @@
Thu Jan 11 17:31:38 1996 Michael Meissner <meissner@tiktok.cygnus.com>
* objdump.c (dump_section_header): Add new section flags
SEC_{EXCLUDE,SORT_ENTRIES}.
Thu Jan 11 11:45:34 1996 Ian Lance Taylor <ian@cygnus.com>
* objcopy.c (filter_symbols): NULL terminate the output symbols.

View File

@ -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))