elfcode.h (EALIGN): Define, dependent on ARCH_SIZE.

(align_file_position): New function.
(elf_locate_sh): Disabled function deleted.
(assign_file_positions_for_symtab_and_strtabs): Align position, then place
symtab, then do other sections.
(map_program_segments): Align program header.
(assign_file_positions_except_relocs): Align section headers.
(assign_file_positions_for_relocs): Align relocation sections.

Fixes ld/3584.
This commit is contained in:
Ken Raeburn 1993-10-07 18:34:59 +00:00
parent fd201fc392
commit 01383fb458
2 changed files with 57 additions and 52 deletions

View File

@ -1,3 +1,14 @@
Thu Oct 7 14:24:13 1993 Ken Raeburn (raeburn@cambridge.cygnus.com)
* elfcode.h (EALIGN): Define, dependent on ARCH_SIZE.
(align_file_position): New function.
(elf_locate_sh): Disabled function deleted.
(assign_file_positions_for_symtab_and_strtabs): Align position,
then place symtab, then do other sections.
(map_program_segments): Align program header.
(assign_file_positions_except_relocs): Align section headers.
(assign_file_positions_for_relocs): Align relocation sections.
Tue Oct 5 10:44:32 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
* configure.host: Recognize hppa*-*-hiux* (currently synonym for hpux).

View File

@ -104,11 +104,13 @@ PTR alloca ();
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
#define ELF_R_SYM(X) ELF64_R_SYM(X)
#define ELFCLASS ELFCLASS64
#define EALIGN 8
#endif
#if ARCH_SIZE == 32
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
#define ELF_R_SYM(X) ELF32_R_SYM(X)
#define ELFCLASS ELFCLASS32
#define EALIGN 4
#endif
static int shstrtab_length_fixed;
@ -581,6 +583,7 @@ DEFUN (bfd_section_from_shdr, (abfd, shindex),
newsect = bfd_make_section (abfd, name);
if (newsect)
{
newsect->filepos = hdr->sh_offset; /* so we can read back the bits */
newsect->flags = SEC_HAS_CONTENTS;
hdr->rawdata = (PTR) newsect;
newsect->_raw_size = hdr->sh_size;
@ -595,6 +598,11 @@ DEFUN (bfd_section_from_shdr, (abfd, shindex),
newsect->flags |= SEC_CODE;
else if (newsect->flags & SEC_ALLOC)
newsect->flags |= SEC_DATA;
/* Check for debugging string tables. */
if (strncmp (name, ".debug", sizeof ".debug" - 1) == 0
|| strncmp (name, ".stab", sizeof ".stab" - 1) == 0)
newsect->flags |= SEC_DEBUGGING;
}
return true;
@ -802,7 +810,7 @@ DEFUN (elf_file_p, (x_ehdrp), Elf_External_Ehdr * x_ehdrp)
FIXME: There is memory leak if we are called more than once with the same
ABFD, and that bfd already has tdata allocated, since we allocate more tdata
and the old tdata is orphaned. Since it's in the bfd obstack, there isn't
much we can do about this except possibly rewrite the code. There are
much we can do about this except possibly rewrite the code. There are
also other bfd_allocs that may be the source of memory leaks as well. */
bfd_target *
@ -1197,9 +1205,10 @@ fix_up_strtabs (abfd, asect, obj)
if (!asect)
abort ();
elf_section_data(asect)->this_hdr.sh_link = this_idx;
/* @@ Assuming 32 bits! */
this_hdr->sh_entsize = 0xc;
elf_section_data(asect)->this_hdr.sh_entsize = 0xc;
this_hdr->sh_type = SHT_STRTAB;
}
}
@ -1295,48 +1304,6 @@ DEFUN (elf_fake_sections, (abfd, asect, obj),
this_hdr->sh_flags |= SHF_EXECINSTR;
}
#if 0
/*
xxxINTERNAL_FUNCTION
bfd_elf_locate_sh
xxxSYNOPSIS
struct elf_internal_shdr *bfd_elf_locate_sh (bfd *abfd,
struct strtab *strtab,
struct elf_internal_shdr *shdrp,
CONST char *name);
xxxDESCRIPTION
Helper function to locate an ELF section header given the
name of a BFD section.
*/
static struct elf_internal_shdr *
DEFUN (elf_locate_sh, (abfd, strtab, shdrp, name),
bfd * abfd AND
struct strtab *strtab AND
struct elf_internal_shdr *shdrp AND
CONST char *name)
{
Elf_Internal_Shdr *gotit = NULL;
int max, i;
if (shdrp != NULL && strtab != NULL)
{
max = elf_elfheader (abfd)->e_shnum;
for (i = 1; i < max; i++)
{
if (!strcmp (strtab->tab + shdrp[i].sh_name, name))
{
gotit = &shdrp[i];
}
}
}
return gotit;
}
#endif
/* Map symbol from it's internal number to the external number, moving
all local symbols to be at the head of the list. */
@ -1600,6 +1567,13 @@ assign_file_position_for_section (i_shdrp, offset)
return offset;
}
static INLINE file_ptr
align_file_position (off)
file_ptr off;
{
return (off + EALIGN - 1) & ~(EALIGN - 1);
}
static INLINE file_ptr
assign_file_positions_for_symtab_and_strtabs (abfd, off)
bfd *abfd;
@ -1607,8 +1581,9 @@ assign_file_positions_for_symtab_and_strtabs (abfd, off)
{
struct elf_obj_tdata *t = elf_tdata (abfd);
off = assign_file_position_for_section (&t->shstrtab_hdr, off);
off = align_file_position (off);
off = assign_file_position_for_section (&t->symtab_hdr, off);
off = assign_file_position_for_section (&t->shstrtab_hdr, off);
off = assign_file_position_for_section (&t->strtab_hdr, off);
return off;
}
@ -1754,12 +1729,12 @@ map_program_segments (abfd)
}
i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr);
sz = sizeof (Elf_External_Phdr) * n_segs;
if (i_ehdrp->e_ehsize + sz <= lowest_offset)
i_ehdrp->e_phoff = i_ehdrp->e_ehsize;
if (align_file_position (i_ehdrp->e_ehsize) + sz <= lowest_offset)
i_ehdrp->e_phoff = align_file_position (i_ehdrp->e_ehsize);
else
{
i_ehdrp->e_phoff = elf_tdata (abfd)->next_file_pos;
elf_tdata (abfd)->next_file_pos += sz;
i_ehdrp->e_phoff = align_file_position (elf_tdata (abfd)->next_file_pos);
elf_tdata (abfd)->next_file_pos = i_ehdrp->e_phoff + sz;
}
phdr = (Elf_Internal_Phdr*) bfd_alloc (abfd,
n_segs * sizeof (Elf_Internal_Phdr));
@ -1816,6 +1791,7 @@ assign_file_positions_except_relocs (abfd)
if (!exec_p)
{
/* Section headers. */
off = align_file_position (off);
i_ehdrp->e_shoff = off;
off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
@ -1866,11 +1842,12 @@ assign_file_positions_except_relocs (abfd)
}
}
off = assign_file_position_for_section (i_shdrp, off);
if (exec_p
&& get_elf_backend_data(abfd)->maxpagesize > 1
&& i_shdrp->sh_type == SHT_PROGBITS
&& (i_shdrp->sh_flags & SHF_ALLOC)
&& (i_shdrp->sh_offset - i_shdrp->sh_addr) % get_elf_backend_data(abfd)->maxpagesize != 0)
&& (i_shdrp->sh_offset - i_shdrp->sh_addr) % get_elf_backend_data (abfd)->maxpagesize != 0)
abort ();
}
if (exec_p)
@ -1880,6 +1857,7 @@ assign_file_positions_except_relocs (abfd)
off = elf_tdata (abfd)->next_file_pos;
/* Section headers. */
off = align_file_position (off);
i_ehdrp->e_shoff = off;
off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
@ -2230,6 +2208,7 @@ assign_file_positions_for_relocs (abfd)
shdrp = shdrpp[i];
if (shdrp->sh_type != SHT_REL && shdrp->sh_type != SHT_RELA)
continue;
off = align_file_position (off);
off = assign_file_position_for_section (shdrp, off);
}
elf_tdata(abfd)->next_file_pos = off;
@ -2348,6 +2327,21 @@ DEFUN (elf_section_from_bfd_section, (abfd, asect),
return index;
}
break;
case SHT_STRTAB:
/* fix_up_strtabs will generate STRTAB sections with names
of .stab*str. */
if (!strncmp (asect->name, ".stab", 5)
&& !strcmp ("str", asect->name + strlen (asect->name) - 3))
{
if (hdr->rawdata)
{
if (((struct sec *) (hdr->rawdata)) == asect)
return index;
}
break;
}
/* FALL THROUGH */
default:
{
struct elf_backend_data *bed = get_elf_backend_data (abfd);
@ -2392,7 +2386,7 @@ DEFUN (elf_symbol_from_bfd_symbol, (abfd, asym_ptr_ptr),
indx = asym_ptr->section->index;
if (elf_section_syms (abfd)[indx])
asym_ptr->udata = elf_section_syms (abfd)[indx]->udata;
}
}
if (asym_ptr->udata)
idx = ((Elf_Sym_Extra *)asym_ptr->udata)->elf_sym_num;