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:
parent
fd201fc392
commit
01383fb458
2 changed files with 57 additions and 52 deletions
|
@ -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)
|
Tue Oct 5 10:44:32 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||||
|
|
||||||
* configure.host: Recognize hppa*-*-hiux* (currently synonym for hpux).
|
* configure.host: Recognize hppa*-*-hiux* (currently synonym for hpux).
|
||||||
|
|
|
@ -104,11 +104,13 @@ PTR alloca ();
|
||||||
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
|
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
|
||||||
#define ELF_R_SYM(X) ELF64_R_SYM(X)
|
#define ELF_R_SYM(X) ELF64_R_SYM(X)
|
||||||
#define ELFCLASS ELFCLASS64
|
#define ELFCLASS ELFCLASS64
|
||||||
|
#define EALIGN 8
|
||||||
#endif
|
#endif
|
||||||
#if ARCH_SIZE == 32
|
#if ARCH_SIZE == 32
|
||||||
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
|
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
|
||||||
#define ELF_R_SYM(X) ELF32_R_SYM(X)
|
#define ELF_R_SYM(X) ELF32_R_SYM(X)
|
||||||
#define ELFCLASS ELFCLASS32
|
#define ELFCLASS ELFCLASS32
|
||||||
|
#define EALIGN 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int shstrtab_length_fixed;
|
static int shstrtab_length_fixed;
|
||||||
|
@ -581,6 +583,7 @@ DEFUN (bfd_section_from_shdr, (abfd, shindex),
|
||||||
newsect = bfd_make_section (abfd, name);
|
newsect = bfd_make_section (abfd, name);
|
||||||
if (newsect)
|
if (newsect)
|
||||||
{
|
{
|
||||||
|
newsect->filepos = hdr->sh_offset; /* so we can read back the bits */
|
||||||
newsect->flags = SEC_HAS_CONTENTS;
|
newsect->flags = SEC_HAS_CONTENTS;
|
||||||
hdr->rawdata = (PTR) newsect;
|
hdr->rawdata = (PTR) newsect;
|
||||||
newsect->_raw_size = hdr->sh_size;
|
newsect->_raw_size = hdr->sh_size;
|
||||||
|
@ -595,6 +598,11 @@ DEFUN (bfd_section_from_shdr, (abfd, shindex),
|
||||||
newsect->flags |= SEC_CODE;
|
newsect->flags |= SEC_CODE;
|
||||||
else if (newsect->flags & SEC_ALLOC)
|
else if (newsect->flags & SEC_ALLOC)
|
||||||
newsect->flags |= SEC_DATA;
|
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;
|
return true;
|
||||||
|
@ -1197,9 +1205,10 @@ fix_up_strtabs (abfd, asect, obj)
|
||||||
if (!asect)
|
if (!asect)
|
||||||
abort ();
|
abort ();
|
||||||
elf_section_data(asect)->this_hdr.sh_link = this_idx;
|
elf_section_data(asect)->this_hdr.sh_link = this_idx;
|
||||||
|
|
||||||
/* @@ Assuming 32 bits! */
|
/* @@ 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;
|
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
|
/* Map symbol from it's internal number to the external number, moving
|
||||||
all local symbols to be at the head of the list. */
|
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;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INLINE file_ptr
|
||||||
|
align_file_position (off)
|
||||||
|
file_ptr off;
|
||||||
|
{
|
||||||
|
return (off + EALIGN - 1) & ~(EALIGN - 1);
|
||||||
|
}
|
||||||
|
|
||||||
static INLINE file_ptr
|
static INLINE file_ptr
|
||||||
assign_file_positions_for_symtab_and_strtabs (abfd, off)
|
assign_file_positions_for_symtab_and_strtabs (abfd, off)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
@ -1607,8 +1581,9 @@ assign_file_positions_for_symtab_and_strtabs (abfd, off)
|
||||||
{
|
{
|
||||||
struct elf_obj_tdata *t = elf_tdata (abfd);
|
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->symtab_hdr, off);
|
||||||
|
off = assign_file_position_for_section (&t->shstrtab_hdr, off);
|
||||||
off = assign_file_position_for_section (&t->strtab_hdr, off);
|
off = assign_file_position_for_section (&t->strtab_hdr, off);
|
||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
|
@ -1754,12 +1729,12 @@ map_program_segments (abfd)
|
||||||
}
|
}
|
||||||
i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr);
|
i_ehdrp->e_phentsize = sizeof (Elf_External_Phdr);
|
||||||
sz = sizeof (Elf_External_Phdr) * n_segs;
|
sz = sizeof (Elf_External_Phdr) * n_segs;
|
||||||
if (i_ehdrp->e_ehsize + sz <= lowest_offset)
|
if (align_file_position (i_ehdrp->e_ehsize) + sz <= lowest_offset)
|
||||||
i_ehdrp->e_phoff = i_ehdrp->e_ehsize;
|
i_ehdrp->e_phoff = align_file_position (i_ehdrp->e_ehsize);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
i_ehdrp->e_phoff = elf_tdata (abfd)->next_file_pos;
|
i_ehdrp->e_phoff = align_file_position (elf_tdata (abfd)->next_file_pos);
|
||||||
elf_tdata (abfd)->next_file_pos += sz;
|
elf_tdata (abfd)->next_file_pos = i_ehdrp->e_phoff + sz;
|
||||||
}
|
}
|
||||||
phdr = (Elf_Internal_Phdr*) bfd_alloc (abfd,
|
phdr = (Elf_Internal_Phdr*) bfd_alloc (abfd,
|
||||||
n_segs * sizeof (Elf_Internal_Phdr));
|
n_segs * sizeof (Elf_Internal_Phdr));
|
||||||
|
@ -1816,6 +1791,7 @@ assign_file_positions_except_relocs (abfd)
|
||||||
if (!exec_p)
|
if (!exec_p)
|
||||||
{
|
{
|
||||||
/* Section headers. */
|
/* Section headers. */
|
||||||
|
off = align_file_position (off);
|
||||||
i_ehdrp->e_shoff = off;
|
i_ehdrp->e_shoff = off;
|
||||||
off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
|
off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
|
||||||
|
|
||||||
|
@ -1866,6 +1842,7 @@ assign_file_positions_except_relocs (abfd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
off = assign_file_position_for_section (i_shdrp, off);
|
off = assign_file_position_for_section (i_shdrp, off);
|
||||||
|
|
||||||
if (exec_p
|
if (exec_p
|
||||||
&& get_elf_backend_data(abfd)->maxpagesize > 1
|
&& get_elf_backend_data(abfd)->maxpagesize > 1
|
||||||
&& i_shdrp->sh_type == SHT_PROGBITS
|
&& i_shdrp->sh_type == SHT_PROGBITS
|
||||||
|
@ -1880,6 +1857,7 @@ assign_file_positions_except_relocs (abfd)
|
||||||
off = elf_tdata (abfd)->next_file_pos;
|
off = elf_tdata (abfd)->next_file_pos;
|
||||||
|
|
||||||
/* Section headers. */
|
/* Section headers. */
|
||||||
|
off = align_file_position (off);
|
||||||
i_ehdrp->e_shoff = off;
|
i_ehdrp->e_shoff = off;
|
||||||
off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
|
off += i_ehdrp->e_shnum * i_ehdrp->e_shentsize;
|
||||||
|
|
||||||
|
@ -2230,6 +2208,7 @@ assign_file_positions_for_relocs (abfd)
|
||||||
shdrp = shdrpp[i];
|
shdrp = shdrpp[i];
|
||||||
if (shdrp->sh_type != SHT_REL && shdrp->sh_type != SHT_RELA)
|
if (shdrp->sh_type != SHT_REL && shdrp->sh_type != SHT_RELA)
|
||||||
continue;
|
continue;
|
||||||
|
off = align_file_position (off);
|
||||||
off = assign_file_position_for_section (shdrp, off);
|
off = assign_file_position_for_section (shdrp, off);
|
||||||
}
|
}
|
||||||
elf_tdata(abfd)->next_file_pos = off;
|
elf_tdata(abfd)->next_file_pos = off;
|
||||||
|
@ -2348,6 +2327,21 @@ DEFUN (elf_section_from_bfd_section, (abfd, asect),
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
{
|
{
|
||||||
struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
struct elf_backend_data *bed = get_elf_backend_data (abfd);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue