Preserve machine dependent section header flags when reading ELF object file.

* elf-bfd.h (struct elf_backend_data): Add elf_backend_section_flags
	field.
	* elf.c (_bfd_elf_make_section_from_shdr): Call the
	elf_backend_section_flags function.
	* elf64-ia64.c (elf64_ia64_section_from_shdr): Delete flag conversion
	code.
	(elf64_ia64_section_flags): New function containing flag conversion
	code.
	(elf_backend_section_flags): Define to elf64_ia64_section_flags.
	* elfxx-target.h (elf_backend_section_flags): Define.
	(elfNN_bed): Initialize elf_backend_section_flags field.
This commit is contained in:
Jim Wilson
2000-10-05 22:22:27 +00:00
parent afa680f89a
commit fa152c4930
5 changed files with 45 additions and 1 deletions

View File

@ -1,3 +1,17 @@
2000-10-05 Jim Wilson <wilson@cygnus.com>
* elf-bfd.h (struct elf_backend_data): Add elf_backend_section_flags
field.
* elf.c (_bfd_elf_make_section_from_shdr): Call the
elf_backend_section_flags function.
* elf64-ia64.c (elf64_ia64_section_from_shdr): Delete flag conversion
code.
(elf64_ia64_section_flags): New function containing flag conversion
code.
(elf_backend_section_flags): Define to elf64_ia64_section_flags.
* elfxx-target.h (elf_backend_section_flags): Define.
(elfNN_bed): Initialize elf_backend_section_flags field.
2000-10-02 Alan Modra <alan@linuxcare.com.au>
* elf32-hppa.c (elf32_hppa_check_relocs): Correct call to

View File

@ -391,6 +391,11 @@ struct elf_backend_data
Elf32_Internal_Shdr *,
char *));
/* A function to convert machine dependent section header flags to
BFD internal section header flags. */
boolean (*elf_backend_section_flags) PARAMS ((flagword *,
Elf32_Internal_Shdr *));
/* A function to handle unusual program segment types when creating BFD
sections from ELF program segments. */
boolean (*elf_backend_section_from_phdr) PARAMS ((bfd *,

View File

@ -345,6 +345,7 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name)
{
asection *newsect;
flagword flags;
struct elf_backend_data *bed;
if (hdr->bfd_section != NULL)
{
@ -410,6 +411,11 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name)
if (strncmp (name, ".gnu.linkonce", sizeof ".gnu.linkonce" - 1) == 0)
flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
bed = get_elf_backend_data (abfd);
if (bed->elf_backend_section_flags)
if (! bed->elf_backend_section_flags (&flags, hdr))
return false;
if (! bfd_set_section_flags (abfd, newsect, flags))
return false;

View File

@ -946,8 +946,21 @@ elf64_ia64_section_from_shdr (abfd, hdr, name)
return false;
newsect = hdr->bfd_section;
return true;
}
/* Convert IA-64 specific section flags to bfd internal section flags. */
/* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV
flag. */
static boolean
elf64_ia64_section_flags (flags, hdr)
flagword *flags;
Elf64_Internal_Shdr *hdr;
{
if (hdr->sh_flags & SHF_IA_64_SHORT)
newsect->flags |= SEC_SMALL_DATA;
*flags |= SEC_SMALL_DATA;
return true;
}
@ -4064,6 +4077,8 @@ elf64_ia64_print_private_bfd_data (abfd, ptr)
#define elf_backend_section_from_shdr \
elf64_ia64_section_from_shdr
#define elf_backend_section_flags \
elf64_ia64_section_flags
#define elf_backend_fake_sections \
elf64_ia64_fake_sections
#define elf_backend_add_symbol_hook \

View File

@ -237,6 +237,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef elf_backend_section_from_shdr
#define elf_backend_section_from_shdr 0
#endif
#ifndef elf_backend_section_flags
#define elf_backend_section_flags 0
#endif
#ifndef elf_backend_section_from_phdr
#define elf_backend_section_from_phdr 0
#endif
@ -368,6 +371,7 @@ static CONST struct elf_backend_data elfNN_bed =
elf_backend_get_symbol_type,
elf_backend_section_processing,
elf_backend_section_from_shdr,
elf_backend_section_flags,
elf_backend_section_from_phdr,
elf_backend_fake_sections,
elf_backend_section_from_bfd_section,