binutils-gdb/gold
Alan Modra 23cedd1dc9 PowerPC inline PLT call support
In addition to the existing relocs we need two more to mark all
instructions in the call sequence, PLTCALL on the call itself (plus
the toc restore insn for ppc64), and PLTSEQ on others.  All
relocations in a particular sequence have the same symbol.

Example ppc64 ELFv2 assembly:
 .reloc .,R_PPC64_PLTSEQ,puts
	std 2,24(1)
	addis 12,2,puts@plt@ha	# .reloc .,R_PPC64_PLT16_HA,puts
	ld 12,puts@plt@l(12)	# .reloc .,R_PPC64_PLT16_LO_DS,puts
 .reloc .,R_PPC64_PLTSEQ,puts
	mtctr 12
 .reloc .,R_PPC64_PLTCALL,puts
	bctrl
	ld 2,24(1)

Example ppc32 -fPIC assembly:
	addis 12,30,puts+32768@plt@ha # .reloc .,R_PPC_PLT16_HA,puts+0x8000
	lwz 12,12,puts+32768@plt@l    # .reloc .,R_PPC_PLT16_LO,puts+0x8000
 .reloc .,R_PPC_PLTSEQ,puts+32768
	mtctr 12
 .reloc .,R_PPC_PLTCALL,puts+32768
	bctrl

Marking sequences like this allows the linker to convert them to nops
and a direct call if the target symbol turns out to be local.

When the call is __tls_get_addr, each relocation shown above is paired
with an R_PPC*_TLSLD or R_PPC*_TLSGD reloc to additionally mark the
sequence for possible TLS optimization.  The TLSLD or TLSGD relocs are
emitted first.

include/
	* elf/ppc.h (R_PPC_PLTSEQ, R_PPC_PLTCALL): Define.
	* elf/ppc64.h (R_PPC64_PLTSEQ, R_PPC64_PLTCALL): Define.
bfd/
	* elf32-ppc.c (ppc_elf_howto_raw): Add PLTSEQ and PLTCALL howtos.
	(is_plt_seq_reloc): New function.
	(ppc_elf_check_relocs): Handle PLTSEQ and PLTCALL relocs.
	(ppc_elf_tls_optimize): Handle inline plt call sequence.
	(ppc_elf_relax_section): Handle PLTCALL reloc.
	(ppc_elf_relocate_section): Nop out inline plt call sequence when
	resolving locally.
	* elf64-ppc.c (ppc64_elf_howto_raw): Add R_PPC64_PLTSEQ and
	R_PPC64_PLTCALL entries.  Comment R_PPC64_TOCSAVE.
	(has_tls_get_addr_call): Correct comment.
	(is_branch_reloc): Add PLTCALL.
	(is_plt_seq_reloc): New function.
	(ppc64_elf_check_relocs): Handle PLT16_LO_DS reloc.  Set
	has_tls_reloc for R_PPC64_TLSGD and R_PPC64_TLSLD.  Create plt
	entry for R_PPC64_PLTCALL.
	(ppc64_elf_tls_optimize): Handle inline plt call sequence.
	(ppc_type_of_stub): Handle PLTCALL reloc.
	(toc_adjusting_stub_needed): Likewise.
	(ppc64_elf_relocate_section): Set "can_plt_call" for PLTCALL
	reloc insn.  Nop out inline plt call sequence when resolving
	locally.  Handle __tls_get_addr inline plt call optimization.
elfcpp/
	* powerpc.h (R_POWERPC_PLTSEQ, R_POWERPC_PLTCALL): Define.
gold/
	* powerpc.cc (Target_powerpc::Track_tls::maybe_skip_tls_get_addr_call):
	Handle inline plt sequence relocs.
	(Stub_table::Plt_stub_key::Plt_stub_key): Likewise.
	(Target_powerpc::Scan::reloc_needs_plt_for_ifunc): Likewise.
	(Target_powerpc::Relocate::relocate): Likewise.
2018-04-09 17:25:20 +09:30
..
po Update Spanish translations for ld/ opcodes/ and gold/ sub-directories 2018-04-04 09:00:18 +01:00
testsuite Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
aarch64-reloc-property.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
aarch64-reloc-property.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
aarch64-reloc.def Add support for R_AARCH64_TLSLE_LDST8_TPREL_LO12, etc. 2018-03-28 09:10:25 -07:00
aarch64.cc Further improve warnings for relocations referring to discarded sections. 2018-04-06 22:50:14 -07:00
aclocal.m4 Use top-level config support for enabling plugins. 2018-03-28 14:02:41 -07:00
archive.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
archive.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
arm-reloc-property.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
arm-reloc-property.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
arm-reloc.def Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
arm.cc Further improve warnings for relocations referring to discarded sections. 2018-04-06 22:50:14 -07:00
attributes.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
attributes.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
binary.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
binary.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
ChangeLog PowerPC inline PLT call support 2018-04-09 17:25:20 +09:30
ChangeLog-0815 binutils ChangeLog rotation 2016-01-01 22:59:17 +10:30
ChangeLog-2016 ChangeLog rotation 2017-01-02 13:55:05 +10:30
ChangeLog-2017 ChangeLog rotation 2018-01-03 17:49:42 +10:30
common.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
common.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
compressed_output.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
compressed_output.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
config.in Add configure flag to enable gnu hash style by default. 2017-08-08 07:25:39 +09:30
configure Use top-level config support for enabling plugins. 2018-03-28 14:02:41 -07:00
configure.ac Use top-level config support for enabling plugins. 2018-03-28 14:02:41 -07:00
configure.tgt Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
copy-relocs.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
copy-relocs.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
cref.cc Apply: 2018-01-12 11:05:58 -08:00
cref.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
debug.h Add --debug=plugin option to record plugin actions. 2018-03-23 10:05:38 -07:00
defstd.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
defstd.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
descriptors.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
descriptors.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
dirsearch.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
dirsearch.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
dwarf_reader.cc Add support for DWARF-4 line number tables. 2018-02-02 17:44:27 -08:00
dwarf_reader.h Add support for DWARF-4 line number tables. 2018-02-02 17:44:27 -08:00
dwp.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
dwp.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
dynobj.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
dynobj.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
ehframe.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
ehframe.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
errors.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
errors.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
expression.cc Fix symbol resolution with linker plugins for defsym symbols. 2018-02-15 17:35:16 -08:00
ffsll.c Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
fileread.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
fileread.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
freebsd.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
ftruncate.c Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gc.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gc.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gdb-index.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gdb-index.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gold-threads.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gold-threads.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gold.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
gold.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
i386.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
icf.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
icf.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
incremental-dump.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
incremental.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
incremental.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
int_encoding.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
int_encoding.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
layout.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
layout.h Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
main.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
Makefile.am Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
Makefile.in Use top-level config support for enabling plugins. 2018-03-28 14:02:41 -07:00
mapfile.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
mapfile.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
merge.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
merge.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
mips.cc Revert previous patch and apply revised patch. 2018-04-05 09:45:07 -07:00
mremap.c Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
nacl.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
nacl.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
NEWS Update gold version number to 1.15. 2018-01-12 18:38:11 -08:00
object.cc Further improve warnings for relocations referring to discarded sections. 2018-04-06 22:50:14 -07:00
object.h Further improve warnings for relocations referring to discarded sections. 2018-04-06 22:50:14 -07:00
options.cc Use top-level config support for enabling plugins. 2018-03-28 14:02:41 -07:00
options.h Use top-level config support for enabling plugins. 2018-03-28 14:02:41 -07:00
output.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
output.h Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
parameters.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
parameters.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
plugin.cc Fix case where IR file provides symbol visibility but replacement file does not. 2018-03-26 10:54:45 -07:00
plugin.h Add --debug=plugin option to record plugin actions. 2018-03-23 10:05:38 -07:00
powerpc.cc PowerPC inline PLT call support 2018-04-09 17:25:20 +09:30
pread.c Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
README Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
readsyms.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
readsyms.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
reduced_debug_output.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
reduced_debug_output.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
reloc-types.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
reloc.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
reloc.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
resolve.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
s390.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
script-c.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
script-sections.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
script-sections.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
script.cc Fix symbol resolution with linker plugins for defsym symbols. 2018-02-15 17:35:16 -08:00
script.h Fix symbol resolution with linker plugins for defsym symbols. 2018-02-15 17:35:16 -08:00
sparc.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
stringpool.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
stringpool.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
symtab.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
symtab.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
system.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
target-reloc.h Further improve warnings for relocations referring to discarded sections. 2018-04-06 22:50:14 -07:00
target-select.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
target-select.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
target.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
target.h Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
tilegx.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
timer.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
timer.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
tls.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
TODO * TODO: New file. 2008-04-03 00:33:37 +00:00
token.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
version.cc Update gold version number to 1.15. 2018-01-12 18:38:11 -08:00
workqueue-internal.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
workqueue-threads.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
workqueue.cc Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
workqueue.h Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30
x86_64.cc Fix problem where mixed section types can cause internal error during a -r link. 2018-04-02 19:07:04 -07:00
yyscript.y Update year range in copyright notice of binutils files 2018-01-03 17:49:56 +10:30

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

gold is an ELF linker.  It is intended to have complete support for
ELF and to run as fast as possible on modern systems.  For normal use
it is a drop-in replacement for the older GNU linker.

gold is part of the GNU binutils.  See ../binutils/README for more
general notes, including where to send bug reports.

gold was originally developed at Google, and was contributed to the
Free Software Foundation in March 2008.  At Google it was designed by
Ian Lance Taylor, with major contributions by Cary Coutant, Craig
Silverstein, and Andrew Chatham.

The existing GNU linker manual is intended to be accurate
documentation for features which gold supports.  gold supports most of
the features of the GNU linker for ELF targets.  Notable
omissions--features of the GNU linker not currently supported in
gold--are:
  * MRI compatible linker scripts
  * cross-reference reports (--cref)
  * various other minor options


Notes on the code
=================

These are some notes which may be helpful to people working on the
source code of gold itself.

gold is written in C++.  It is a GNU program, and therefore follows
the GNU formatting standards as modified for C++.  Source documents in
order of decreasing precedence:
    http://www.gnu.org/prep/standards/
    http://gcc.gnu.org/onlinedocs/libstdc++/manual/source_code_style.html
    http://www.zembu.com/eng/procs/c++style.html

The linker is intended to have complete support for cross-compilation,
while still supporting the normal case of native linking as fast as
possible.  In order to do this, many classes are actually templates
whose parameter is the ELF file class (e.g., 32 bits or 64 bits).  The
C++ code is the same, but we don't pay the execution time cost of
always using 64-bit integers if the target is 32 bits.  Many of these
class templates also have an endianness parameter: true for
big-endian, false for little-endian.

The linker is multi-threaded.  The Task class represents a single unit
of work.  Task objects are stored on a single Workqueue object.  Tasks
communicate via Task_token objects.  Task_token objects are only
manipulated while holding the master Workqueue lock.  Relatively few
mutexes are used.


Build requirements
==================

The gold source code uses templates heavily.  Building it requires a
recent version of g++.  g++ 4.0.3 and 4.1.3 are known to work.  g++
3.2, 3.4.3, and 4.1.2 are known to fail.

The linker script parser uses features which are only in newer
versions of bison.  bison 2.3 is known to work.  bison 1.26 is known
to fail.  If you are building gold from an official binutils release,
the bison output should already be included.


Copyright (C) 2012-2018 Free Software Foundation, Inc.

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.