mirror of
https://git.yoctoproject.org/poky
synced 2026-04-01 14:02:23 +02:00
These are fixes mainly cherrypicks for mips/ppc/x86 mainly fixing PRs in ld and gold (From OE-Core rev: f098cfc24bae8e0685bcae53ea4fdc3326ddc6c4) Signed-off-by: Khem Raj <raj.khem@gmail.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
140 lines
4.8 KiB
Diff
140 lines
4.8 KiB
Diff
Upstream-Status: Backport
|
|
|
|
From fbd07e4e15de7a81a2de7f9583fa3240302e2867 Mon Sep 17 00:00:00 2001
|
|
From: David Daney <ddaney@avtrex.com>
|
|
Date: Sun, 11 Dec 2011 02:28:10 +0000
|
|
Subject: [PATCH 028/262] Backport from mainline:
|
|
|
|
2011-12-10 David Daney <david.daney@cavium.com>
|
|
|
|
* elfxx-mips.c (mips_elf_link_hash_table.rld_value): Remove.
|
|
(mips_elf_link_hash_table.rld_symbol): New field;
|
|
(MIPS_ELF_RLD_MAP_SIZE): New macro.
|
|
(_bfd_mips_elf_add_symbol_hook): Remember __rld_obj_head symbol
|
|
in rld_symbol.
|
|
(_bfd_mips_elf_create_dynamic_sections): Remember __rld_map symbol
|
|
in rld_symbol.
|
|
(_bfd_mips_elf_size_dynamic_sections): Set correct size for .rld_map.
|
|
(_bfd_mips_elf_finish_dynamic_symbol): Remove .rld_map handling.
|
|
(_bfd_mips_elf_finish_dynamic_sections): Use rld_symbol to
|
|
calculate DT_MIPS_RLD_MAP value.
|
|
(_bfd_mips_elf_link_hash_table_create): Initialize rld_symbol,
|
|
quit initializing rld_value.
|
|
|
|
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
|
|
index 33a454d..6b908ad 100644
|
|
--- a/bfd/elfxx-mips.c
|
|
+++ b/bfd/elfxx-mips.c
|
|
@@ -436,8 +436,8 @@ struct mips_elf_link_hash_table
|
|
entry is set to the address of __rld_obj_head as in IRIX5. */
|
|
bfd_boolean use_rld_obj_head;
|
|
|
|
- /* This is the value of the __rld_map or __rld_obj_head symbol. */
|
|
- bfd_vma rld_value;
|
|
+ /* The __rld_map or __rld_obj_head symbol. */
|
|
+ struct elf_link_hash_entry *rld_symbol;
|
|
|
|
/* This is set if we see any mips16 stub sections. */
|
|
bfd_boolean mips16_stubs_seen;
|
|
@@ -768,6 +768,10 @@ static bfd *reldyn_sorting_bfd;
|
|
#define MIPS_ELF_GOT_SIZE(abfd) \
|
|
(get_elf_backend_data (abfd)->s->arch_size / 8)
|
|
|
|
+/* The size of the .rld_map section. */
|
|
+#define MIPS_ELF_RLD_MAP_SIZE(abfd) \
|
|
+ (get_elf_backend_data (abfd)->s->arch_size / 8)
|
|
+
|
|
/* The size of a symbol-table entry. */
|
|
#define MIPS_ELF_SYM_SIZE(abfd) \
|
|
(get_elf_backend_data (abfd)->s->sizeof_sym)
|
|
@@ -7081,6 +7085,7 @@ _bfd_mips_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
|
|
return FALSE;
|
|
|
|
mips_elf_hash_table (info)->use_rld_obj_head = TRUE;
|
|
+ mips_elf_hash_table (info)->rld_symbol = h;
|
|
}
|
|
|
|
/* If this is a mips16 text symbol, add 1 to the value to make it
|
|
@@ -7266,6 +7271,7 @@ _bfd_mips_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
|
|
|
if (! bfd_elf_link_record_dynamic_symbol (info, h))
|
|
return FALSE;
|
|
+ mips_elf_hash_table (info)->rld_symbol = h;
|
|
}
|
|
}
|
|
|
|
@@ -9027,7 +9033,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
|
|
{
|
|
/* We add a room for __rld_map. It will be filled in by the
|
|
rtld to contain a pointer to the _r_debug structure. */
|
|
- s->size += 4;
|
|
+ s->size += MIPS_ELF_RLD_MAP_SIZE (output_bfd);
|
|
}
|
|
else if (SGI_COMPAT (output_bfd)
|
|
&& CONST_STRNEQ (name, ".compact_rel"))
|
|
@@ -10030,31 +10036,6 @@ _bfd_mips_elf_finish_dynamic_symbol (bfd *output_bfd,
|
|
if (IRIX_COMPAT (output_bfd) == ict_irix6)
|
|
mips_elf_irix6_finish_dynamic_symbol (output_bfd, name, sym);
|
|
|
|
- if (! info->shared)
|
|
- {
|
|
- if (! mips_elf_hash_table (info)->use_rld_obj_head
|
|
- && (strcmp (name, "__rld_map") == 0
|
|
- || strcmp (name, "__RLD_MAP") == 0))
|
|
- {
|
|
- asection *s = bfd_get_section_by_name (dynobj, ".rld_map");
|
|
- BFD_ASSERT (s != NULL);
|
|
- sym->st_value = s->output_section->vma + s->output_offset;
|
|
- bfd_put_32 (output_bfd, 0, s->contents);
|
|
- if (mips_elf_hash_table (info)->rld_value == 0)
|
|
- mips_elf_hash_table (info)->rld_value = sym->st_value;
|
|
- }
|
|
- else if (mips_elf_hash_table (info)->use_rld_obj_head
|
|
- && strcmp (name, "__rld_obj_head") == 0)
|
|
- {
|
|
- /* IRIX6 does not use a .rld_map section. */
|
|
- if (IRIX_COMPAT (output_bfd) == ict_irix5
|
|
- || IRIX_COMPAT (output_bfd) == ict_none)
|
|
- BFD_ASSERT (bfd_get_section_by_name (dynobj, ".rld_map")
|
|
- != NULL);
|
|
- mips_elf_hash_table (info)->rld_value = sym->st_value;
|
|
- }
|
|
- }
|
|
-
|
|
/* Keep dynamic MIPS16 symbols odd. This allows the dynamic linker to
|
|
treat MIPS16 symbols like any other. */
|
|
if (ELF_ST_IS_MIPS16 (sym->st_other))
|
|
@@ -10517,7 +10498,19 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
|
|
break;
|
|
|
|
case DT_MIPS_RLD_MAP:
|
|
- dyn.d_un.d_ptr = mips_elf_hash_table (info)->rld_value;
|
|
+ {
|
|
+ struct elf_link_hash_entry *h;
|
|
+ h = mips_elf_hash_table (info)->rld_symbol;
|
|
+ if (!h)
|
|
+ {
|
|
+ dyn_to_skip = MIPS_ELF_DYN_SIZE (dynobj);
|
|
+ swap_out_p = FALSE;
|
|
+ break;
|
|
+ }
|
|
+ s = h->root.u.def.section;
|
|
+ dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset
|
|
+ + h->root.u.def.value);
|
|
+ }
|
|
break;
|
|
|
|
case DT_MIPS_OPTIONS:
|
|
@@ -12794,7 +12787,7 @@ _bfd_mips_elf_link_hash_table_create (bfd *abfd)
|
|
ret->procedure_count = 0;
|
|
ret->compact_rel_size = 0;
|
|
ret->use_rld_obj_head = FALSE;
|
|
- ret->rld_value = 0;
|
|
+ ret->rld_symbol = NULL;
|
|
ret->mips16_stubs_seen = FALSE;
|
|
ret->use_plts_and_copy_relocs = FALSE;
|
|
ret->is_vxworks = FALSE;
|
|
--
|
|
1.7.9.5
|
|
|