};
+#define X86_PCREL_TYPE_P(TYPE) ((TYPE) == R_386_PC32)
+
+#define X86_SIZE_TYPE_P(TYPE) ((TYPE) == R_386_SIZE32)
+
#ifdef DEBUG_GEN_RELOC
#define TRACE(str) \
fprintf (stderr, "i386 bfd reloc lookup %d (%s)\n", code, str)
#define PLTRESOLVE_RELOCS 2
#define PLT_NON_JUMP_SLOT_RELOCS 2
-/* Architecture-specific backend data for i386. */
-
-struct elf_i386_backend_data
-{
- /* Value used to fill the unused bytes of the first PLT entry. */
- bfd_byte plt0_pad_byte;
-
- /* Target system. */
- enum
- {
- is_normal,
- is_vxworks,
- is_nacl
- } os;
-};
-
-#define get_elf_i386_backend_data(abfd) \
- ((const struct elf_i386_backend_data *) \
- get_elf_backend_data (abfd)->arch_data)
-
/* These are the standard parameters. */
-static const struct elf_i386_backend_data elf_i386_arch_bed =
+static const struct elf_x86_backend_data elf_i386_arch_bed =
{
- 0, /* plt0_pad_byte */
is_normal /* os */
};
{
unsigned int new_to_type = to_type;
- if (bfd_link_executable (info)
- && h != NULL
- && h->dynindx == -1
- && (tls_type & GOT_TLS_IE))
+ if (TLS_TRANSITION_IE_TO_LE_P (info, h, tls_type))
new_to_type = R_386_TLS_LE_32;
if (to_type == R_386_TLS_GD
unsigned int *r_type_p,
Elf_Internal_Rela *irel,
struct elf_link_hash_entry *h,
+ bfd_boolean *converted,
struct bfd_link_info *link_info)
{
struct elf_x86_link_hash_table *htab;
bfd_put_32 (abfd, -4, contents + irel->r_offset);
irel->r_info = ELF32_R_INFO (r_symndx, R_386_PC32);
*r_type_p = R_386_PC32;
+ *converted = TRUE;
}
}
else
bfd_put_8 (abfd, opcode, contents + roff - 2);
irel->r_info = ELF32_R_INFO (r_symndx, r_type);
*r_type_p = r_type;
+ *converted = TRUE;
}
}
const Elf_Internal_Rela *rel_end;
asection *sreloc;
bfd_byte *contents;
+ bfd_boolean converted;
if (bfd_link_relocatable (info))
return TRUE;
symtab_hdr = &elf_symtab_hdr (abfd);
sym_hashes = elf_sym_hashes (abfd);
+ converted = FALSE;
+
sreloc = NULL;
rel_end = relocs + sec->reloc_count;
{
Elf_Internal_Rela *irel = (Elf_Internal_Rela *) rel;
if (!elf_i386_convert_load_reloc (abfd, symtab_hdr, contents,
- &r_type, irel, h, info))
+ &r_type, irel, h,
+ &converted, info))
goto error_return;
}
switch (r_type)
{
case R_386_TLS_LDM:
- htab->tls_ld_or_ldm_got.refcount += 1;
+ htab->tls_ld_or_ldm_got.refcount = 1;
goto create_got;
case R_386_PLT32:
if (h == NULL)
continue;
- eh->has_got_reloc = 1;
+ eh->zero_undefweak &= 0x2;
h->needs_plt = 1;
h->plt.refcount += 1;
break;
if (h != NULL)
{
- h->got.refcount += 1;
+ h->got.refcount = 1;
old_tls_type = elf_x86_hash_entry (h)->tls_type;
}
else
elf_x86_local_got_tls_type (abfd)
= (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
}
- local_got_refcounts[r_symndx] += 1;
+ local_got_refcounts[r_symndx] = 1;
old_tls_type = elf_x86_local_got_tls_type (abfd) [r_symndx];
}
if (r_type != R_386_TLS_IE)
{
if (eh != NULL)
- eh->has_got_reloc = 1;
+ eh->zero_undefweak &= 0x2;
break;
}
/* Fall through */
case R_386_TLS_LE_32:
case R_386_TLS_LE:
if (eh != NULL)
- eh->has_got_reloc = 1;
+ eh->zero_undefweak &= 0x2;
if (bfd_link_executable (info))
break;
info->flags |= DF_STATIC_TLS;
case R_386_32:
case R_386_PC32:
if (eh != NULL && (sec->flags & SEC_CODE) != 0)
- eh->has_non_got_reloc = 1;
+ eh->zero_undefweak |= 0x2;
do_relocation:
/* We are called after all symbols have been resolved. Only
relocation against STT_GNU_IFUNC symbol must go through
size_reloc = FALSE;
do_size:
- /* If we are creating a shared library, and this is a reloc
- against a global symbol, or a non PC relative reloc
- against a local symbol, then we need to copy the reloc
- into the shared library. However, if we are linking with
- -Bsymbolic, we do not need to copy a reloc against a
- global symbol which is defined in an object we are
- including in the link (i.e., DEF_REGULAR is set). At
- this point we have not seen all the input files, so it is
- possible that DEF_REGULAR is not set now but will be set
- later (it is never cleared). In case of a weak definition,
- DEF_REGULAR may be cleared later by a strong definition in
- a shared library. We account for that possibility below by
- storing information in the relocs_copied field of the hash
- table entry. A similar situation occurs when creating
- shared libraries and symbol visibility changes render the
- symbol local.
-
- If on the other hand, we are creating an executable, we
- may need to keep relocations for symbols satisfied by a
- dynamic library if we manage to avoid copy relocs for the
- symbol.
-
- Generate dynamic pointer relocation against STT_GNU_IFUNC
- symbol in the non-code section. */
- if ((bfd_link_pic (info)
- && (r_type != R_386_PC32
- || (h != NULL
- && (! (bfd_link_pie (info)
- || SYMBOLIC_BIND (info, h))
- || h->root.type == bfd_link_hash_defweak
- || !h->def_regular))))
- || (h != NULL
- && h->type == STT_GNU_IFUNC
- && r_type == R_386_32
- && (sec->flags & SEC_CODE) == 0)
- || (ELIMINATE_COPY_RELOCS
- && !bfd_link_pic (info)
- && h != NULL
- && (h->root.type == bfd_link_hash_defweak
- || !h->def_regular)))
+ if (NEED_DYNAMIC_RELOCATION_P (info, h, sec, r_type,
+ R_386_32))
{
struct elf_dyn_relocs *p;
struct elf_dyn_relocs **head;
if (elf_section_data (sec)->this_hdr.contents != contents)
{
- if (!info->keep_memory)
+ if (!converted && !info->keep_memory)
free (contents);
else
{
- /* Cache the section contents for elf_link_input_bfd. */
+ /* Cache the section contents for elf_link_input_bfd if any
+ load is converted or --no-keep-memory isn't used. */
elf_section_data (sec)->this_hdr.contents = contents;
}
}
+ /* Cache relocations if any load is converted. */
+ if (elf_section_data (sec)->relocs != relocs && converted)
+ elf_section_data (sec)->relocs = (Elf_Internal_Rela *) relocs;
+
return TRUE;
error_return:
local_tlsdesc_gotents = elf_x86_local_tlsdesc_gotent (input_bfd);
/* We have to handle relocations in vxworks .tls_vars sections
specially, because the dynamic loader is 'weird'. */
- is_vxworks_tls = (htab->is_vxworks
+ is_vxworks_tls = (htab->target_os == is_vxworks
&& bfd_link_pic (info)
&& !strcmp (input_section->output_section->name,
".tls_vars"));
+ input_section->output_offset
+ offset);
- if (h->dynindx == -1
- || h->forced_local
- || bfd_link_executable (info))
+ if (POINTER_LOCAL_IFUNC_P (info, h))
{
info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
h->root.root.string,
relative_reloc = FALSE;
if (h != NULL)
{
- bfd_boolean dyn;
-
off = h->got.offset;
- dyn = htab->elf.dynamic_sections_created;
- if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
- bfd_link_pic (info),
- h)
- || (bfd_link_pic (info)
- && SYMBOL_REFERENCES_LOCAL_P (info, h))
- || (ELF_ST_VISIBILITY (h->other)
- && h->root.type == bfd_link_hash_undefweak))
+ if (RESOLVED_LOCALLY_P (info, h, htab))
{
- /* This is actually a static link, or it is a
- -Bsymbolic link and the symbol is defined
- locally, or the symbol was forced to be local
- because of a version file. We must initialize
- this entry in the global offset table. Since the
- offset must always be a multiple of 4, we use the
- least significant bit to record whether we have
- initialized it already.
+ /* We must initialize this entry in the global offset
+ table. Since the offset must always be a multiple
+ of 4, we use the least significant bit to record
+ whether we have initialized it already.
When doing a dynamic link, we create a .rel.got
relocation entry to initialize the value. This
htab->elf.sgot->contents + off);
h->got.offset |= 1;
- if (h->dynindx == -1
- && !h->forced_local
- && h->root.type != bfd_link_hash_undefweak
- && bfd_link_pic (info))
+ if (GENERATE_RELATIVE_RELOC_P (info, h))
{
/* PR ld/21402: If this symbol isn't dynamic
in PIC, generate R_386_RELATIVE here. */
|| is_vxworks_tls)
break;
- /* Copy dynamic function pointer relocations. Don't generate
- dynamic relocations against resolved undefined weak symbols
- in PIE, except for R_386_PC32. */
- if ((bfd_link_pic (info)
- && (h == NULL
- || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
- && (!resolved_to_zero
- || r_type == R_386_PC32))
- || h->root.type != bfd_link_hash_undefweak))
- && ((r_type != R_386_PC32 && r_type != R_386_SIZE32)
- || !SYMBOL_CALLS_LOCAL (info, h)))
- || (ELIMINATE_COPY_RELOCS
- && !bfd_link_pic (info)
- && h != NULL
- && h->dynindx != -1
- && (!h->non_got_ref
- || eh->func_pointer_refcount > 0
- || (h->root.type == bfd_link_hash_undefweak
- && !resolved_to_zero))
- && ((h->def_dynamic && !h->def_regular)
- /* Undefined weak symbol is bound locally when
- PIC is false. */
- || h->root.type == bfd_link_hash_undefweak)))
+ if (GENERATE_DYNAMIC_RELOCATION_P (info, eh, r_type,
+ FALSE, resolved_to_zero,
+ (r_type == R_386_PC32)))
{
Elf_Internal_Rela outrel;
bfd_boolean skip, relocate;
if (skip)
memset (&outrel, 0, sizeof outrel);
- else if (h != NULL
- && h->dynindx != -1
- && (r_type == R_386_PC32
- || !(bfd_link_executable (info)
- || SYMBOLIC_BIND (info, h))
- || !h->def_regular))
+ else if (COPY_INPUT_RELOC_P (info, h, r_type))
outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
else
{
relplt = htab->elf.irelplt;
}
- /* This symbol has an entry in the procedure linkage table. Set
- it up. */
-
- if ((h->dynindx == -1
- && !local_undefweak
- && !((h->forced_local || bfd_link_executable (info))
- && h->def_regular
- && h->type == STT_GNU_IFUNC))
- || plt == NULL
- || gotplt == NULL
- || relplt == NULL)
- abort ();
+ VERIFY_PLT_ENTRY (info, h, plt, gotplt, relplt, local_undefweak)
/* Get the index in the procedure linkage table which
corresponds to this symbol. This is the index of this symbol
resolved_plt->contents + plt_offset
+ htab->plt.plt_got_offset);
- if (htab->is_vxworks)
+ if (htab->target_os == is_vxworks)
{
int s, k, reloc_index;
rel.r_offset = (gotplt->output_section->vma
+ gotplt->output_offset
+ got_offset);
- if (h->dynindx == -1
- || ((bfd_link_executable (info)
- || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
- && h->def_regular
- && h->type == STT_GNU_IFUNC))
+ if (PLT_LOCAL_IFUNC_P (info, h))
{
info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"),
h->root.root.string,
asection *s;
/* This symbol needs a copy reloc. Set it up. */
-
- if (h->dynindx == -1
- || (h->root.type != bfd_link_hash_defined
- && h->root.type != bfd_link_hash_defweak)
- || htab->elf.srelbss == NULL
- || htab->elf.sreldynrelro == NULL)
- abort ();
+ VERIFY_COPY_RELOC (h, htab)
rel.r_offset = (h->root.u.def.value
+ h->root.u.def.section->output_section->vma
struct bfd_link_info *info)
{
struct elf_x86_link_hash_table *htab;
- bfd *dynobj;
- asection *sdyn;
- const struct elf_i386_backend_data *abed;
- htab = elf_x86_hash_table (info, I386_ELF_DATA);
+ htab = _bfd_x86_elf_finish_dynamic_sections (output_bfd, info);
if (htab == NULL)
return FALSE;
- dynobj = htab->elf.dynobj;
- sdyn = bfd_get_linker_section (dynobj, ".dynamic");
- abed = get_elf_i386_backend_data (output_bfd);
+ if (!htab->elf.dynamic_sections_created)
+ return TRUE;
- if (htab->elf.dynamic_sections_created)
+ if (htab->elf.splt && htab->elf.splt->size > 0)
{
- Elf32_External_Dyn *dyncon, *dynconend;
-
- if (sdyn == NULL || htab->elf.sgot == NULL)
- abort ();
+ /* UnixWare sets the entsize of .plt to 4, although that doesn't
+ really seem like the right value. */
+ elf_section_data (htab->elf.splt->output_section)
+ ->this_hdr.sh_entsize = 4;
- dyncon = (Elf32_External_Dyn *) sdyn->contents;
- dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
- for (; dyncon < dynconend; dyncon++)
+ if (htab->plt.has_plt0)
{
- Elf_Internal_Dyn dyn;
- asection *s;
-
- bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
-
- switch (dyn.d_tag)
+ /* Fill in the special first entry in the procedure linkage
+ table. */
+ memcpy (htab->elf.splt->contents, htab->plt.plt0_entry,
+ htab->lazy_plt->plt0_entry_size);
+ memset (htab->elf.splt->contents + htab->lazy_plt->plt0_entry_size,
+ htab->plt0_pad_byte,
+ htab->plt.plt_entry_size - htab->lazy_plt->plt0_entry_size);
+ if (!bfd_link_pic (info))
{
- default:
- if (htab->is_vxworks
- && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
- break;
- continue;
-
- case DT_PLTGOT:
- s = htab->elf.sgotplt;
- dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
- break;
-
- case DT_JMPREL:
- s = htab->elf.srelplt;
- dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
- break;
-
- case DT_PLTRELSZ:
- s = htab->elf.srelplt;
- dyn.d_un.d_val = s->size;
- break;
- }
-
- bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
- }
-
- if (htab->elf.splt && htab->elf.splt->size > 0)
- {
- /* UnixWare sets the entsize of .plt to 4, although that doesn't
- really seem like the right value. */
- elf_section_data (htab->elf.splt->output_section)
- ->this_hdr.sh_entsize = 4;
+ bfd_put_32 (output_bfd,
+ (htab->elf.sgotplt->output_section->vma
+ + htab->elf.sgotplt->output_offset
+ + 4),
+ htab->elf.splt->contents
+ + htab->lazy_plt->plt0_got1_offset);
+ bfd_put_32 (output_bfd,
+ (htab->elf.sgotplt->output_section->vma
+ + htab->elf.sgotplt->output_offset
+ + 8),
+ htab->elf.splt->contents
+ + htab->lazy_plt->plt0_got2_offset);
- if (htab->plt.has_plt0)
- {
- /* Fill in the special first entry in the procedure linkage
- table. */
- memcpy (htab->elf.splt->contents, htab->plt.plt0_entry,
- htab->lazy_plt->plt0_entry_size);
- memset (htab->elf.splt->contents + htab->lazy_plt->plt0_entry_size,
- abed->plt0_pad_byte,
- htab->plt.plt_entry_size - htab->lazy_plt->plt0_entry_size);
- if (!bfd_link_pic (info))
+ if (htab->target_os == is_vxworks)
{
- bfd_put_32 (output_bfd,
- (htab->elf.sgotplt->output_section->vma
- + htab->elf.sgotplt->output_offset
- + 4),
- htab->elf.splt->contents
- + htab->lazy_plt->plt0_got1_offset);
- bfd_put_32 (output_bfd,
- (htab->elf.sgotplt->output_section->vma
- + htab->elf.sgotplt->output_offset
- + 8),
- htab->elf.splt->contents
- + htab->lazy_plt->plt0_got2_offset);
+ Elf_Internal_Rela rel;
+ int num_plts = (htab->elf.splt->size
+ / htab->plt.plt_entry_size) - 1;
+ unsigned char *p;
+ asection *srelplt2 = htab->srelplt2;
+
+ /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
+ + 4. On IA32 we use REL relocations so the
+ addend goes in the PLT directly. */
+ rel.r_offset = (htab->elf.splt->output_section->vma
+ + htab->elf.splt->output_offset
+ + htab->lazy_plt->plt0_got1_offset);
+ rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
+ R_386_32);
+ bfd_elf32_swap_reloc_out (output_bfd, &rel,
+ srelplt2->contents);
+ /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
+ + 8. */
+ rel.r_offset = (htab->elf.splt->output_section->vma
+ + htab->elf.splt->output_offset
+ + htab->lazy_plt->plt0_got2_offset);
+ rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
+ R_386_32);
+ bfd_elf32_swap_reloc_out (output_bfd, &rel,
+ srelplt2->contents +
+ sizeof (Elf32_External_Rel));
+ /* Correct the .rel.plt.unloaded relocations. */
+ p = srelplt2->contents;
+ if (bfd_link_pic (info))
+ p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
+ else
+ p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
- if (htab->is_vxworks)
+ for (; num_plts; num_plts--)
{
- Elf_Internal_Rela rel;
- int num_plts = (htab->elf.splt->size
- / htab->plt.plt_entry_size) - 1;
- unsigned char *p;
- asection *srelplt2 = htab->srelplt2;
-
- /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
- + 4. On IA32 we use REL relocations so the
- addend goes in the PLT directly. */
- rel.r_offset = (htab->elf.splt->output_section->vma
- + htab->elf.splt->output_offset
- + htab->lazy_plt->plt0_got1_offset);
+ bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
R_386_32);
- bfd_elf32_swap_reloc_out (output_bfd, &rel,
- srelplt2->contents);
- /* Generate a relocation for _GLOBAL_OFFSET_TABLE_
- + 8. */
- rel.r_offset = (htab->elf.splt->output_section->vma
- + htab->elf.splt->output_offset
- + htab->lazy_plt->plt0_got2_offset);
- rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
- R_386_32);
- bfd_elf32_swap_reloc_out (output_bfd, &rel,
- srelplt2->contents +
- sizeof (Elf32_External_Rel));
- /* Correct the .rel.plt.unloaded relocations. */
- p = srelplt2->contents;
- if (bfd_link_pic (info))
- p += PLTRESOLVE_RELOCS_SHLIB * sizeof (Elf32_External_Rel);
- else
- p += PLTRESOLVE_RELOCS * sizeof (Elf32_External_Rel);
+ bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
+ p += sizeof (Elf32_External_Rel);
- for (; num_plts; num_plts--)
- {
- bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
- rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
- R_386_32);
- bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
- p += sizeof (Elf32_External_Rel);
-
- bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
- rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
- R_386_32);
- bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
- p += sizeof (Elf32_External_Rel);
- }
+ bfd_elf32_swap_reloc_in (output_bfd, p, &rel);
+ rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
+ R_386_32);
+ bfd_elf32_swap_reloc_out (output_bfd, &rel, p);
+ p += sizeof (Elf32_External_Rel);
}
}
}
}
-
- if (htab->plt_got != NULL && htab->plt_got->size > 0)
- elf_section_data (htab->plt_got->output_section)
- ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
-
- if (htab->plt_second != NULL && htab->plt_second->size > 0)
- elf_section_data (htab->plt_second->output_section)
- ->this_hdr.sh_entsize = htab->non_lazy_plt->plt_entry_size;
- }
-
- /* Fill in the first three entries in the global offset table. */
- if (htab->elf.sgotplt && htab->elf.sgotplt->size > 0)
- {
- if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
- {
- _bfd_error_handler
- (_("discarded output section: `%A'"), htab->elf.sgotplt);
- return FALSE;
- }
-
- bfd_put_32 (output_bfd,
- (sdyn == NULL ? 0
- : sdyn->output_section->vma + sdyn->output_offset),
- htab->elf.sgotplt->contents);
- bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 4);
- bfd_put_32 (output_bfd, 0, htab->elf.sgotplt->contents + 8);
-
- elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize = 4;
- }
-
- /* Adjust .eh_frame for .plt section. */
- if (htab->plt_eh_frame != NULL
- && htab->plt_eh_frame->contents != NULL)
- {
- if (htab->elf.splt != NULL
- && htab->elf.splt->size != 0
- && (htab->elf.splt->flags & SEC_EXCLUDE) == 0
- && htab->elf.splt->output_section != NULL
- && htab->plt_eh_frame->output_section != NULL)
- {
- bfd_vma plt_start = htab->elf.splt->output_section->vma;
- bfd_vma eh_frame_start = htab->plt_eh_frame->output_section->vma
- + htab->plt_eh_frame->output_offset
- + PLT_FDE_START_OFFSET;
- bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
- htab->plt_eh_frame->contents
- + PLT_FDE_START_OFFSET);
- }
- if (htab->plt_eh_frame->sec_info_type
- == SEC_INFO_TYPE_EH_FRAME)
- {
- if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
- htab->plt_eh_frame,
- htab->plt_eh_frame->contents))
- return FALSE;
- }
}
- /* Adjust .eh_frame for .plt.got section. */
- if (htab->plt_got_eh_frame != NULL
- && htab->plt_got_eh_frame->contents != NULL)
- {
- if (htab->plt_got != NULL
- && htab->plt_got->size != 0
- && (htab->plt_got->flags & SEC_EXCLUDE) == 0
- && htab->plt_got->output_section != NULL
- && htab->plt_got_eh_frame->output_section != NULL)
- {
- bfd_vma plt_start = htab->plt_got->output_section->vma;
- bfd_vma eh_frame_start = htab->plt_got_eh_frame->output_section->vma
- + htab->plt_got_eh_frame->output_offset
- + PLT_FDE_START_OFFSET;
- bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
- htab->plt_got_eh_frame->contents
- + PLT_FDE_START_OFFSET);
- }
- if (htab->plt_got_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
- {
- if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
- htab->plt_got_eh_frame,
- htab->plt_got_eh_frame->contents))
- return FALSE;
- }
- }
-
- /* Adjust .eh_frame for the second PLT section. */
- if (htab->plt_second_eh_frame != NULL
- && htab->plt_second_eh_frame->contents != NULL)
- {
- if (htab->plt_second != NULL
- && htab->plt_second->size != 0
- && (htab->plt_second->flags & SEC_EXCLUDE) == 0
- && htab->plt_second->output_section != NULL
- && htab->plt_second_eh_frame->output_section != NULL)
- {
- bfd_vma plt_start = htab->plt_second->output_section->vma;
- bfd_vma eh_frame_start
- = (htab->plt_second_eh_frame->output_section->vma
- + htab->plt_second_eh_frame->output_offset
- + PLT_FDE_START_OFFSET);
- bfd_put_signed_32 (dynobj, plt_start - eh_frame_start,
- htab->plt_second_eh_frame->contents
- + PLT_FDE_START_OFFSET);
- }
- if (htab->plt_second_eh_frame->sec_info_type
- == SEC_INFO_TYPE_EH_FRAME)
- {
- if (! _bfd_elf_write_section_eh_frame (output_bfd, info,
- htab->plt_second_eh_frame,
- htab->plt_second_eh_frame->contents))
- return FALSE;
- }
- }
-
- if (htab->elf.sgot && htab->elf.sgot->size > 0)
- elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
-
/* Fill PLT entries for undefined weak symbols in PIE. */
if (bfd_link_pie (info))
bfd_hash_traverse (&info->hash->table,
lazy_plt = NULL;
non_lazy_ibt_plt = NULL;
lazy_ibt_plt = NULL;
- switch (get_elf_i386_backend_data (abfd)->os)
+ switch (get_elf_x86_backend_data (abfd)->target_os)
{
case is_normal:
non_lazy_plt = &elf_i386_non_lazy_plt;
{
struct elf_x86_init_table init_table;
- init_table.normal_target = FALSE;
- init_table.is_vxworks = FALSE;
- switch (get_elf_i386_backend_data (info->output_bfd)->os)
+ switch (get_elf_x86_backend_data (info->output_bfd)->target_os)
{
case is_normal:
+ init_table.plt0_pad_byte = 0x0;
init_table.lazy_plt = &elf_i386_lazy_plt;
init_table.non_lazy_plt = &elf_i386_non_lazy_plt;
init_table.lazy_ibt_plt = &elf_i386_lazy_ibt_plt;
init_table.non_lazy_ibt_plt = &elf_i386_non_lazy_ibt_plt;
- init_table.normal_target = TRUE;
break;
case is_vxworks:
+ init_table.plt0_pad_byte = 0x90;
init_table.lazy_plt = &elf_i386_lazy_plt;
init_table.non_lazy_plt = NULL;
init_table.lazy_ibt_plt = NULL;
init_table.non_lazy_ibt_plt = NULL;
- init_table.is_vxworks = TRUE;
break;
case is_nacl:
+ init_table.plt0_pad_byte = 0x90;
init_table.lazy_plt = &elf_i386_nacl_plt;
init_table.non_lazy_plt = NULL;
init_table.lazy_ibt_plt = NULL;
#define elf_backend_reloc_type_class elf_i386_reloc_type_class
#define elf_backend_relocate_section elf_i386_relocate_section
#define elf_backend_setup_gnu_properties elf_i386_link_setup_gnu_properties
+#define elf_backend_hide_symbol _bfd_x86_elf_hide_symbol
+
+#define elf_backend_linux_prpsinfo32_ugid16 TRUE
#include "elf32-target.h"
|| PLT_FDE_LENGTH != 36 \
|| PLT_FDE_START_OFFSET != 4 + PLT_CIE_LENGTH + 8 \
|| PLT_FDE_LEN_OFFSET != 4 + PLT_CIE_LENGTH + 12)
-# error "Need elf_i386_backend_data parameters for eh_frame_plt offsets!"
+# error "Need elf_x86_backend_data parameters for eh_frame_plt offsets!"
#endif
PLT_CIE_LENGTH, 0, 0, 0, /* CIE length */
0, 0, 0, 0, /* CIE ID */
sizeof (elf_i386_nacl_eh_frame_plt) /* eh_frame_plt_size */
};
-static const struct elf_i386_backend_data elf_i386_nacl_arch_bed =
+static const struct elf_x86_backend_data elf_i386_nacl_arch_bed =
{
- 0x90, /* plt0_pad_byte: nop insn */
is_nacl /* os */
};
#undef elf_backend_plt_alignment
#define elf_backend_plt_alignment 4
-static const struct elf_i386_backend_data elf_i386_vxworks_arch_bed =
+static const struct elf_x86_backend_data elf_i386_vxworks_arch_bed =
{
- 0x90, /* plt0_pad_byte */
is_vxworks /* os */
};