constify elfNN_bed
elfNN_bed was made writable as an expedient means of communicating ld -z max-page-size and ld -z common-page-size values to BFD linker code, and even for objcopy to communicate segment alignment between copy_private_bfd_data, rewrite_elf_program_header and assign_file_positions_for_load_sections. Some time later elfNN_bed elf_osabi was written by gas. It turns out none of these modifications to elfNN_bed was necessary, so make it const again. include/ * bfdlink.h (struct bfd_link_info): Add maxpagesize and commonpagesize. bfd/ * elfxx-target.h (elfNN_bed): Constify. * bfd.c (bfd_elf_set_pagesize): Delete. (bfd_emul_set_maxpagesize, bfd_emul_set_commonpagesize): Delete. * elf.c (get_program_header_size): Get commonpagesize from link info. (_bfd_elf_map_sections_to_segments): Get maxpagesize from link info. (assign_file_positions_for_load_sections): Likewise. (assign_file_positions_for_non_load_sections): Likewise. (rewrite_elf_program_header): Add maxpagesize param. Set map_p_align. (copy_private_bfd_data): Don't call bfd_elf_set_maxpagesize. Instead pass maxpagesize to rewrite_elf_program_header. * elf32-nds32.c (relax_range_measurement): Add link_info param. Get maxpagesize from link_info. Adjust caller. * bfd-in2.h: Regenerate. gas/ * config/obj-elf.c (obj_elf_section): Don't set elf_osabi here. (obj_elf_type): Likewise. ld/ * ld.h (ld_config_type): Delete maxpagesize and commonpagesize. * emultempl/elf.em: Use link_info rather than config for maxpagesize and commonpagesize. * emultempl/ppc32elf.em: Likewise. * ldexp.c (fold_binary, fold_name): Likewise. * ldemul.c (after_parse_default): Likewise. (set_output_arch_default): Don't call bfd_emul_set_maxpagesize or bfd_emul_set_commonpagesize.
This commit is contained in:
parent
3f75e1d67f
commit
c410035d37
16 changed files with 120 additions and 127 deletions
|
@ -1,3 +1,20 @@
|
||||||
|
2020-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* elfxx-target.h (elfNN_bed): Constify.
|
||||||
|
* bfd.c (bfd_elf_set_pagesize): Delete.
|
||||||
|
(bfd_emul_set_maxpagesize, bfd_emul_set_commonpagesize): Delete.
|
||||||
|
* elf.c (get_program_header_size): Get commonpagesize from
|
||||||
|
link info.
|
||||||
|
(_bfd_elf_map_sections_to_segments): Get maxpagesize from link info.
|
||||||
|
(assign_file_positions_for_load_sections): Likewise.
|
||||||
|
(assign_file_positions_for_non_load_sections): Likewise.
|
||||||
|
(rewrite_elf_program_header): Add maxpagesize param. Set map_p_align.
|
||||||
|
(copy_private_bfd_data): Don't call bfd_elf_set_maxpagesize.
|
||||||
|
Instead pass maxpagesize to rewrite_elf_program_header.
|
||||||
|
* elf32-nds32.c (relax_range_measurement): Add link_info param.
|
||||||
|
Get maxpagesize from link_info. Adjust caller.
|
||||||
|
* bfd-in2.h: Regenerate.
|
||||||
|
|
||||||
2020-12-16 Alan Modra <amodra@gmail.com>
|
2020-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* elflink.c (elf_flags_to_names): Constify.
|
* elflink.c (elf_flags_to_names): Constify.
|
||||||
|
|
|
@ -7224,12 +7224,8 @@ bfd_boolean bfd_alt_mach_code (bfd *abfd, int alternative);
|
||||||
|
|
||||||
bfd_vma bfd_emul_get_maxpagesize (const char *);
|
bfd_vma bfd_emul_get_maxpagesize (const char *);
|
||||||
|
|
||||||
void bfd_emul_set_maxpagesize (const char *, bfd_vma);
|
|
||||||
|
|
||||||
bfd_vma bfd_emul_get_commonpagesize (const char *, bfd_boolean);
|
bfd_vma bfd_emul_get_commonpagesize (const char *, bfd_boolean);
|
||||||
|
|
||||||
void bfd_emul_set_commonpagesize (const char *, bfd_vma);
|
|
||||||
|
|
||||||
char *bfd_demangle (bfd *, const char *, int);
|
char *bfd_demangle (bfd *, const char *, int);
|
||||||
|
|
||||||
void bfd_update_compression_header
|
void bfd_update_compression_header
|
||||||
|
|
68
bfd/bfd.c
68
bfd/bfd.c
|
@ -2335,49 +2335,6 @@ bfd_emul_get_maxpagesize (const char *emul)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
bfd_elf_set_pagesize (const bfd_target *target, bfd_vma size,
|
|
||||||
int offset, const bfd_target *orig_target)
|
|
||||||
{
|
|
||||||
if (target->flavour == bfd_target_elf_flavour)
|
|
||||||
{
|
|
||||||
const struct elf_backend_data *bed;
|
|
||||||
|
|
||||||
bed = xvec_get_elf_backend_data (target);
|
|
||||||
*((bfd_vma *) ((char *) bed + offset)) = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target->alternative_target
|
|
||||||
&& target->alternative_target != orig_target)
|
|
||||||
bfd_elf_set_pagesize (target->alternative_target, size, offset,
|
|
||||||
orig_target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
FUNCTION
|
|
||||||
bfd_emul_set_maxpagesize
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
void bfd_emul_set_maxpagesize (const char *, bfd_vma);
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
For ELF, set the maximum page size for the emulation. It is
|
|
||||||
a no-op for other formats.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
bfd_emul_set_maxpagesize (const char *emul, bfd_vma size)
|
|
||||||
{
|
|
||||||
const bfd_target *target;
|
|
||||||
|
|
||||||
target = bfd_find_target (emul, NULL);
|
|
||||||
if (target)
|
|
||||||
bfd_elf_set_pagesize (target, size,
|
|
||||||
offsetof (struct elf_backend_data,
|
|
||||||
maxpagesize), target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FUNCTION
|
FUNCTION
|
||||||
bfd_emul_get_commonpagesize
|
bfd_emul_get_commonpagesize
|
||||||
|
@ -2413,31 +2370,6 @@ bfd_emul_get_commonpagesize (const char *emul, bfd_boolean relro)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
FUNCTION
|
|
||||||
bfd_emul_set_commonpagesize
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
void bfd_emul_set_commonpagesize (const char *, bfd_vma);
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
For ELF, set the common page size for the emulation. It is
|
|
||||||
a no-op for other formats.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
bfd_emul_set_commonpagesize (const char *emul, bfd_vma size)
|
|
||||||
{
|
|
||||||
const bfd_target *target;
|
|
||||||
|
|
||||||
target = bfd_find_target (emul, NULL);
|
|
||||||
if (target)
|
|
||||||
bfd_elf_set_pagesize (target, size,
|
|
||||||
offsetof (struct elf_backend_data,
|
|
||||||
commonpagesize), target);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FUNCTION
|
FUNCTION
|
||||||
bfd_demangle
|
bfd_demangle
|
||||||
|
|
54
bfd/elf.c
54
bfd/elf.c
|
@ -4428,7 +4428,14 @@ get_program_header_size (bfd *abfd, struct bfd_link_info *info)
|
||||||
&& (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
|
&& (elf_tdata (abfd)->has_gnu_osabi & elf_gnu_osabi_mbind) != 0)
|
||||||
{
|
{
|
||||||
/* Add a PT_GNU_MBIND segment for each mbind section. */
|
/* Add a PT_GNU_MBIND segment for each mbind section. */
|
||||||
unsigned int page_align_power = bfd_log2 (bed->commonpagesize);
|
bfd_vma commonpagesize;
|
||||||
|
unsigned int page_align_power;
|
||||||
|
|
||||||
|
if (info != NULL)
|
||||||
|
commonpagesize = info->commonpagesize;
|
||||||
|
else
|
||||||
|
commonpagesize = bed->commonpagesize;
|
||||||
|
page_align_power = bfd_log2 (commonpagesize);
|
||||||
for (s = abfd->sections; s != NULL; s = s->next)
|
for (s = abfd->sections; s != NULL; s = s->next)
|
||||||
if (elf_section_flags (s) & SHF_GNU_MBIND)
|
if (elf_section_flags (s) & SHF_GNU_MBIND)
|
||||||
{
|
{
|
||||||
|
@ -4672,7 +4679,10 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
|
||||||
phdr_size += bed->s->sizeof_ehdr;
|
phdr_size += bed->s->sizeof_ehdr;
|
||||||
/* phdr_size is compared to LMA values which are in bytes. */
|
/* phdr_size is compared to LMA values which are in bytes. */
|
||||||
phdr_size /= opb;
|
phdr_size /= opb;
|
||||||
maxpagesize = bed->maxpagesize;
|
if (info != NULL)
|
||||||
|
maxpagesize = info->maxpagesize;
|
||||||
|
else
|
||||||
|
maxpagesize = bed->maxpagesize;
|
||||||
if (maxpagesize == 0)
|
if (maxpagesize == 0)
|
||||||
maxpagesize = 1;
|
maxpagesize = 1;
|
||||||
phdr_in_segment = info != NULL && info->load_phdrs;
|
phdr_in_segment = info != NULL && info->load_phdrs;
|
||||||
|
@ -5475,7 +5485,12 @@ assign_file_positions_for_load_sections (bfd *abfd,
|
||||||
|
|
||||||
maxpagesize = 1;
|
maxpagesize = 1;
|
||||||
if ((abfd->flags & D_PAGED) != 0)
|
if ((abfd->flags & D_PAGED) != 0)
|
||||||
maxpagesize = bed->maxpagesize;
|
{
|
||||||
|
if (link_info != NULL)
|
||||||
|
maxpagesize = link_info->maxpagesize;
|
||||||
|
else
|
||||||
|
maxpagesize = bed->maxpagesize;
|
||||||
|
}
|
||||||
|
|
||||||
/* Sections must map to file offsets past the ELF file header. */
|
/* Sections must map to file offsets past the ELF file header. */
|
||||||
off = bed->s->sizeof_ehdr;
|
off = bed->s->sizeof_ehdr;
|
||||||
|
@ -6056,7 +6071,12 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
|
||||||
struct elf_segment_map *m;
|
struct elf_segment_map *m;
|
||||||
file_ptr off;
|
file_ptr off;
|
||||||
unsigned int opb = bfd_octets_per_byte (abfd, NULL);
|
unsigned int opb = bfd_octets_per_byte (abfd, NULL);
|
||||||
|
bfd_vma maxpagesize;
|
||||||
|
|
||||||
|
if (link_info != NULL)
|
||||||
|
maxpagesize = link_info->maxpagesize;
|
||||||
|
else
|
||||||
|
maxpagesize = bed->maxpagesize;
|
||||||
i_shdrpp = elf_elfsections (abfd);
|
i_shdrpp = elf_elfsections (abfd);
|
||||||
end_hdrpp = i_shdrpp + elf_numsections (abfd);
|
end_hdrpp = i_shdrpp + elf_numsections (abfd);
|
||||||
off = elf_next_file_pos (abfd);
|
off = elf_next_file_pos (abfd);
|
||||||
|
@ -6089,7 +6109,7 @@ assign_file_positions_for_non_load_sections (bfd *abfd,
|
||||||
/* We don't need to page align empty sections. */
|
/* We don't need to page align empty sections. */
|
||||||
if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
|
if ((abfd->flags & D_PAGED) != 0 && hdr->sh_size != 0)
|
||||||
off += vma_page_aligned_bias (hdr->sh_addr, off,
|
off += vma_page_aligned_bias (hdr->sh_addr, off,
|
||||||
bed->maxpagesize);
|
maxpagesize);
|
||||||
else
|
else
|
||||||
off += vma_page_aligned_bias (hdr->sh_addr, off,
|
off += vma_page_aligned_bias (hdr->sh_addr, off,
|
||||||
hdr->sh_addralign);
|
hdr->sh_addralign);
|
||||||
|
@ -6767,7 +6787,7 @@ _bfd_elf_symbol_from_bfd_symbol (bfd *abfd, asymbol **asym_ptr_ptr)
|
||||||
/* Rewrite program header information. */
|
/* Rewrite program header information. */
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
|
rewrite_elf_program_header (bfd *ibfd, bfd *obfd, bfd_vma maxpagesize)
|
||||||
{
|
{
|
||||||
Elf_Internal_Ehdr *iehdr;
|
Elf_Internal_Ehdr *iehdr;
|
||||||
struct elf_segment_map *map;
|
struct elf_segment_map *map;
|
||||||
|
@ -6779,7 +6799,6 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
|
||||||
unsigned int num_segments;
|
unsigned int num_segments;
|
||||||
bfd_boolean phdr_included = FALSE;
|
bfd_boolean phdr_included = FALSE;
|
||||||
bfd_boolean p_paddr_valid;
|
bfd_boolean p_paddr_valid;
|
||||||
bfd_vma maxpagesize;
|
|
||||||
struct elf_segment_map *phdr_adjust_seg = NULL;
|
struct elf_segment_map *phdr_adjust_seg = NULL;
|
||||||
unsigned int phdr_adjust_num = 0;
|
unsigned int phdr_adjust_num = 0;
|
||||||
const struct elf_backend_data *bed;
|
const struct elf_backend_data *bed;
|
||||||
|
@ -6792,7 +6811,6 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
|
||||||
pointer_to_map = &map_first;
|
pointer_to_map = &map_first;
|
||||||
|
|
||||||
num_segments = elf_elfheader (ibfd)->e_phnum;
|
num_segments = elf_elfheader (ibfd)->e_phnum;
|
||||||
maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
|
|
||||||
|
|
||||||
/* Returns the end address of the segment + 1. */
|
/* Returns the end address of the segment + 1. */
|
||||||
#define SEGMENT_END(segment, start) \
|
#define SEGMENT_END(segment, start) \
|
||||||
|
@ -7049,6 +7067,17 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
|
||||||
map->p_flags = segment->p_flags;
|
map->p_flags = segment->p_flags;
|
||||||
map->p_flags_valid = 1;
|
map->p_flags_valid = 1;
|
||||||
|
|
||||||
|
if (map->p_type == PT_LOAD
|
||||||
|
&& (ibfd->flags & D_PAGED) != 0
|
||||||
|
&& maxpagesize > 1
|
||||||
|
&& segment->p_align > 1)
|
||||||
|
{
|
||||||
|
map->p_align = segment->p_align;
|
||||||
|
if (segment->p_align > maxpagesize)
|
||||||
|
map->p_align = maxpagesize;
|
||||||
|
map->p_align_valid = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* If the first section in the input segment is removed, there is
|
/* If the first section in the input segment is removed, there is
|
||||||
no need to preserve segment physical address in the corresponding
|
no need to preserve segment physical address in the corresponding
|
||||||
output segment. */
|
output segment. */
|
||||||
|
@ -7613,6 +7642,8 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
||||||
{
|
{
|
||||||
|
bfd_vma maxpagesize;
|
||||||
|
|
||||||
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|
||||||
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
|
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -7697,6 +7728,7 @@ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
||||||
}
|
}
|
||||||
|
|
||||||
rewrite:
|
rewrite:
|
||||||
|
maxpagesize = 0;
|
||||||
if (ibfd->xvec == obfd->xvec)
|
if (ibfd->xvec == obfd->xvec)
|
||||||
{
|
{
|
||||||
/* When rewriting program header, set the output maxpagesize to
|
/* When rewriting program header, set the output maxpagesize to
|
||||||
|
@ -7704,7 +7736,6 @@ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
||||||
Elf_Internal_Phdr *segment;
|
Elf_Internal_Phdr *segment;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
|
unsigned int num_segments = elf_elfheader (ibfd)->e_phnum;
|
||||||
bfd_vma maxpagesize = 0;
|
|
||||||
|
|
||||||
for (i = 0, segment = elf_tdata (ibfd)->phdr;
|
for (i = 0, segment = elf_tdata (ibfd)->phdr;
|
||||||
i < num_segments;
|
i < num_segments;
|
||||||
|
@ -7721,12 +7752,11 @@ copy_private_bfd_data (bfd *ibfd, bfd *obfd)
|
||||||
else
|
else
|
||||||
maxpagesize = segment->p_align;
|
maxpagesize = segment->p_align;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxpagesize != get_elf_backend_data (obfd)->maxpagesize)
|
|
||||||
bfd_emul_set_maxpagesize (bfd_get_target (obfd), maxpagesize);
|
|
||||||
}
|
}
|
||||||
|
if (maxpagesize == 0)
|
||||||
|
maxpagesize = get_elf_backend_data (obfd)->maxpagesize;
|
||||||
|
|
||||||
return rewrite_elf_program_header (ibfd, obfd);
|
return rewrite_elf_program_header (ibfd, obfd, maxpagesize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize private output section information from input section. */
|
/* Initialize private output section information from input section. */
|
||||||
|
|
|
@ -9514,11 +9514,11 @@ nds32_elf_insn_size (bfd *abfd ATTRIBUTE_UNUSED,
|
||||||
to do gp relaxation. */
|
to do gp relaxation. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
relax_range_measurement (bfd *abfd)
|
relax_range_measurement (bfd *abfd, struct bfd_link_info *link_info)
|
||||||
{
|
{
|
||||||
asection *sec_f, *sec_b;
|
asection *sec_f, *sec_b;
|
||||||
/* For upper bound. */
|
/* For upper bound. */
|
||||||
bfd_vma maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
|
bfd_vma maxpgsz;
|
||||||
bfd_vma align;
|
bfd_vma align;
|
||||||
static int decide_relax_range = 0;
|
static int decide_relax_range = 0;
|
||||||
int i;
|
int i;
|
||||||
|
@ -9550,6 +9550,10 @@ relax_range_measurement (bfd *abfd)
|
||||||
sec_b = sec_b->next;
|
sec_b = sec_b->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (link_info != NULL)
|
||||||
|
maxpgsz = link_info->maxpagesize;
|
||||||
|
else
|
||||||
|
maxpgsz = get_elf_backend_data (abfd)->maxpagesize;
|
||||||
/* I guess we can not determine the section before
|
/* I guess we can not determine the section before
|
||||||
gp located section, so we assume the align is max page size. */
|
gp located section, so we assume the align is max page size. */
|
||||||
for (i = 0; i < range_number; i++)
|
for (i = 0; i < range_number; i++)
|
||||||
|
@ -12121,7 +12125,7 @@ nds32_elf_relax_section (bfd *abfd, asection *sec,
|
||||||
is_SDA_BASE_set = 1;
|
is_SDA_BASE_set = 1;
|
||||||
nds32_elf_final_sda_base (sec->output_section->owner, link_info,
|
nds32_elf_final_sda_base (sec->output_section->owner, link_info,
|
||||||
&gp, FALSE);
|
&gp, FALSE);
|
||||||
relax_range_measurement (abfd);
|
relax_range_measurement (abfd, link_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
|
||||||
|
|
|
@ -802,7 +802,7 @@
|
||||||
|
|
||||||
extern const struct elf_size_info _bfd_elfNN_size_info;
|
extern const struct elf_size_info _bfd_elfNN_size_info;
|
||||||
|
|
||||||
static struct elf_backend_data elfNN_bed =
|
static const struct elf_backend_data elfNN_bed =
|
||||||
{
|
{
|
||||||
ELF_ARCH, /* arch */
|
ELF_ARCH, /* arch */
|
||||||
ELF_TARGET_ID, /* target_id */
|
ELF_TARGET_ID, /* target_id */
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2020-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* config/obj-elf.c (obj_elf_section): Don't set elf_osabi here.
|
||||||
|
(obj_elf_type): Likewise.
|
||||||
|
|
||||||
2020-12-15 Alan Modra <amodra@gmail.com>
|
2020-12-15 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
PR 27071
|
PR 27071
|
||||||
|
|
|
@ -1425,13 +1425,13 @@ obj_elf_section (int push)
|
||||||
|
|
||||||
if ((gnu_attr & (SHF_GNU_MBIND | SHF_GNU_RETAIN)) != 0)
|
if ((gnu_attr & (SHF_GNU_MBIND | SHF_GNU_RETAIN)) != 0)
|
||||||
{
|
{
|
||||||
struct elf_backend_data *bed;
|
const struct elf_backend_data *bed;
|
||||||
bfd_boolean mbind_p = (gnu_attr & SHF_GNU_MBIND) != 0;
|
bfd_boolean mbind_p = (gnu_attr & SHF_GNU_MBIND) != 0;
|
||||||
|
|
||||||
if (mbind_p && (attr & SHF_ALLOC) == 0)
|
if (mbind_p && (attr & SHF_ALLOC) == 0)
|
||||||
as_bad (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name);
|
as_bad (_("SHF_ALLOC isn't set for GNU_MBIND section: %s"), name);
|
||||||
|
|
||||||
bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput);
|
bed = get_elf_backend_data (stdoutput);
|
||||||
|
|
||||||
if (bed->elf_osabi != ELFOSABI_GNU
|
if (bed->elf_osabi != ELFOSABI_GNU
|
||||||
&& bed->elf_osabi != ELFOSABI_FREEBSD
|
&& bed->elf_osabi != ELFOSABI_FREEBSD
|
||||||
|
@ -1440,9 +1440,6 @@ obj_elf_section (int push)
|
||||||
mbind_p ? "GNU_MBIND" : "GNU_RETAIN");
|
mbind_p ? "GNU_MBIND" : "GNU_RETAIN");
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (bed->elf_osabi == ELFOSABI_NONE)
|
|
||||||
bed->elf_osabi = ELFOSABI_GNU;
|
|
||||||
|
|
||||||
if (mbind_p)
|
if (mbind_p)
|
||||||
elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_mbind;
|
elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_mbind;
|
||||||
if ((gnu_attr & SHF_GNU_RETAIN) != 0)
|
if ((gnu_attr & SHF_GNU_RETAIN) != 0)
|
||||||
|
@ -2361,13 +2358,12 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED)
|
||||||
|| strcmp (type_name, "10") == 0
|
|| strcmp (type_name, "10") == 0
|
||||||
|| strcmp (type_name, "STT_GNU_IFUNC") == 0)
|
|| strcmp (type_name, "STT_GNU_IFUNC") == 0)
|
||||||
{
|
{
|
||||||
struct elf_backend_data *bed;
|
const struct elf_backend_data *bed;
|
||||||
|
|
||||||
bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput);
|
bed = get_elf_backend_data (stdoutput);
|
||||||
if (bed->elf_osabi == ELFOSABI_NONE)
|
if (bed->elf_osabi != ELFOSABI_NONE
|
||||||
bed->elf_osabi = ELFOSABI_GNU;
|
&& bed->elf_osabi != ELFOSABI_GNU
|
||||||
else if (bed->elf_osabi != ELFOSABI_GNU
|
&& bed->elf_osabi != ELFOSABI_FREEBSD)
|
||||||
&& bed->elf_osabi != ELFOSABI_FREEBSD)
|
|
||||||
as_bad (_("symbol type \"%s\" is supported only by GNU "
|
as_bad (_("symbol type \"%s\" is supported only by GNU "
|
||||||
"and FreeBSD targets"), type_name);
|
"and FreeBSD targets"), type_name);
|
||||||
/* MIPS targets do not support IFUNCS. */
|
/* MIPS targets do not support IFUNCS. */
|
||||||
|
@ -2379,12 +2375,11 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
else if (strcmp (type_name, "gnu_unique_object") == 0)
|
else if (strcmp (type_name, "gnu_unique_object") == 0)
|
||||||
{
|
{
|
||||||
struct elf_backend_data *bed;
|
const struct elf_backend_data *bed;
|
||||||
|
|
||||||
bed = (struct elf_backend_data *) get_elf_backend_data (stdoutput);
|
bed = get_elf_backend_data (stdoutput);
|
||||||
if (bed->elf_osabi == ELFOSABI_NONE)
|
if (bed->elf_osabi != ELFOSABI_NONE
|
||||||
bed->elf_osabi = ELFOSABI_GNU;
|
&& bed->elf_osabi != ELFOSABI_GNU)
|
||||||
else if (bed->elf_osabi != ELFOSABI_GNU)
|
|
||||||
as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
|
as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
|
||||||
type_name);
|
type_name);
|
||||||
elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_unique;
|
elf_tdata (stdoutput)->has_gnu_osabi |= elf_gnu_osabi_unique;
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2020-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* bfdlink.h (struct bfd_link_info): Add maxpagesize and
|
||||||
|
commonpagesize.
|
||||||
|
|
||||||
2020-12-16 Alan Modra <amodra@gmail.com>
|
2020-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* xtensa-isa-internal.h (xtensa_format_internal),
|
* xtensa-isa-internal.h (xtensa_format_internal),
|
||||||
|
|
|
@ -661,6 +661,12 @@ struct bfd_link_info
|
||||||
/* May be used to set ELF visibility for __start_* / __stop_. */
|
/* May be used to set ELF visibility for __start_* / __stop_. */
|
||||||
unsigned int start_stop_visibility;
|
unsigned int start_stop_visibility;
|
||||||
|
|
||||||
|
/* The maximum page size for ELF. */
|
||||||
|
bfd_vma maxpagesize;
|
||||||
|
|
||||||
|
/* The common page size for ELF. */
|
||||||
|
bfd_vma commonpagesize;
|
||||||
|
|
||||||
/* Start and end of RELRO region. */
|
/* Start and end of RELRO region. */
|
||||||
bfd_vma relro_start, relro_end;
|
bfd_vma relro_start, relro_end;
|
||||||
|
|
||||||
|
|
11
ld/ChangeLog
11
ld/ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2020-12-16 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* ld.h (ld_config_type): Delete maxpagesize and commonpagesize.
|
||||||
|
* emultempl/elf.em: Use link_info rather than config
|
||||||
|
for maxpagesize and commonpagesize.
|
||||||
|
* emultempl/ppc32elf.em: Likewise.
|
||||||
|
* ldexp.c (fold_binary, fold_name): Likewise.
|
||||||
|
* ldemul.c (after_parse_default): Likewise.
|
||||||
|
(set_output_arch_default): Don't call bfd_emul_set_maxpagesize
|
||||||
|
or bfd_emul_set_commonpagesize.
|
||||||
|
|
||||||
2020-12-15 Vivek Das Mohapatra <vivek@collabora.com>
|
2020-12-15 Vivek Das Mohapatra <vivek@collabora.com>
|
||||||
|
|
||||||
* emultempl/elf.em (gld${EMULATION_NAME}_handle_option):
|
* emultempl/elf.em (gld${EMULATION_NAME}_handle_option):
|
||||||
|
|
|
@ -716,17 +716,18 @@ fragment <<EOF
|
||||||
{
|
{
|
||||||
char *end;
|
char *end;
|
||||||
|
|
||||||
config.maxpagesize = strtoul (optarg + 14, &end, 0);
|
link_info.maxpagesize = strtoul (optarg + 14, &end, 0);
|
||||||
if (*end || (config.maxpagesize & (config.maxpagesize - 1)) != 0)
|
if (*end
|
||||||
|
|| (link_info.maxpagesize & (link_info.maxpagesize - 1)) != 0)
|
||||||
einfo (_("%F%P: invalid maximum page size \`%s'\n"),
|
einfo (_("%F%P: invalid maximum page size \`%s'\n"),
|
||||||
optarg + 14);
|
optarg + 14);
|
||||||
}
|
}
|
||||||
else if (CONST_STRNEQ (optarg, "common-page-size="))
|
else if (CONST_STRNEQ (optarg, "common-page-size="))
|
||||||
{
|
{
|
||||||
char *end;
|
char *end;
|
||||||
config.commonpagesize = strtoul (optarg + 17, &end, 0);
|
link_info.commonpagesize = strtoul (optarg + 17, &end, 0);
|
||||||
if (*end
|
if (*end
|
||||||
|| (config.commonpagesize & (config.commonpagesize - 1)) != 0)
|
|| (link_info.commonpagesize & (link_info.commonpagesize - 1)) != 0)
|
||||||
einfo (_("%F%P: invalid common page size \`%s'\n"),
|
einfo (_("%F%P: invalid common page size \`%s'\n"),
|
||||||
optarg + 17);
|
optarg + 17);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ ppc_after_open_output (void)
|
||||||
params.emit_stub_syms = (link_info.emitrelocations
|
params.emit_stub_syms = (link_info.emitrelocations
|
||||||
|| bfd_link_pic (&link_info));
|
|| bfd_link_pic (&link_info));
|
||||||
if (params.pagesize == 0)
|
if (params.pagesize == 0)
|
||||||
params.pagesize = config.commonpagesize;
|
params.pagesize = link_info.commonpagesize;
|
||||||
ppc_elf_link_params (&link_info, ¶ms);
|
ppc_elf_link_params (&link_info, ¶ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
6
ld/ld.h
6
ld/ld.h
|
@ -294,12 +294,6 @@ typedef struct
|
||||||
/* The size of the hash table to use. */
|
/* The size of the hash table to use. */
|
||||||
unsigned long hash_table_size;
|
unsigned long hash_table_size;
|
||||||
|
|
||||||
/* The maximum page size for ELF. */
|
|
||||||
bfd_vma maxpagesize;
|
|
||||||
|
|
||||||
/* The common page size for ELF. */
|
|
||||||
bfd_vma commonpagesize;
|
|
||||||
|
|
||||||
/* If set, print discarded sections in map file output. */
|
/* If set, print discarded sections in map file output. */
|
||||||
bfd_boolean print_map_discarded;
|
bfd_boolean print_map_discarded;
|
||||||
|
|
||||||
|
|
13
ld/ldemul.c
13
ld/ldemul.c
|
@ -232,11 +232,11 @@ after_parse_default (void)
|
||||||
if (!is_vma)
|
if (!is_vma)
|
||||||
ldlang_add_undef (entry_symbol.name, entry_from_cmdline);
|
ldlang_add_undef (entry_symbol.name, entry_from_cmdline);
|
||||||
}
|
}
|
||||||
if (config.maxpagesize == 0)
|
if (link_info.maxpagesize == 0)
|
||||||
config.maxpagesize = bfd_emul_get_maxpagesize (default_target);
|
link_info.maxpagesize = bfd_emul_get_maxpagesize (default_target);
|
||||||
if (config.commonpagesize == 0)
|
if (link_info.commonpagesize == 0)
|
||||||
config.commonpagesize = bfd_emul_get_commonpagesize (default_target,
|
link_info.commonpagesize = bfd_emul_get_commonpagesize (default_target,
|
||||||
link_info.relro);
|
link_info.relro);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -303,9 +303,6 @@ set_output_arch_default (void)
|
||||||
/* Set the output architecture and machine if possible. */
|
/* Set the output architecture and machine if possible. */
|
||||||
bfd_set_arch_mach (link_info.output_bfd,
|
bfd_set_arch_mach (link_info.output_bfd,
|
||||||
ldfile_output_architecture, ldfile_output_machine);
|
ldfile_output_architecture, ldfile_output_machine);
|
||||||
|
|
||||||
bfd_emul_set_maxpagesize (output_target, config.maxpagesize);
|
|
||||||
bfd_emul_set_commonpagesize (output_target, config.commonpagesize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -547,8 +547,8 @@ fold_binary (etree_type *tree)
|
||||||
{
|
{
|
||||||
if (!seg->used
|
if (!seg->used
|
||||||
&& config.magic_demand_paged
|
&& config.magic_demand_paged
|
||||||
&& config.maxpagesize != 0
|
&& link_info.maxpagesize != 0
|
||||||
&& (seg->value % config.maxpagesize) != 0)
|
&& (seg->value % link_info.maxpagesize) != 0)
|
||||||
einfo (_("%P: warning: address of `%s' "
|
einfo (_("%P: warning: address of `%s' "
|
||||||
"isn't multiple of maximum page size\n"),
|
"isn't multiple of maximum page size\n"),
|
||||||
segment_name);
|
segment_name);
|
||||||
|
@ -898,9 +898,9 @@ fold_name (etree_type *tree)
|
||||||
|
|
||||||
case CONSTANT:
|
case CONSTANT:
|
||||||
if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
|
if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
|
||||||
new_number (config.maxpagesize);
|
new_number (link_info.maxpagesize);
|
||||||
else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
|
else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
|
||||||
new_number (config.commonpagesize);
|
new_number (link_info.commonpagesize);
|
||||||
else
|
else
|
||||||
einfo (_("%F%P:%pS: unknown constant `%s' referenced in expression\n"),
|
einfo (_("%F%P:%pS: unknown constant `%s' referenced in expression\n"),
|
||||||
tree, tree->name.name);
|
tree, tree->name.name);
|
||||||
|
|
Loading…
Add table
Reference in a new issue