binutils-gdb/gold
Alan Modra 08be322439 PowerPC PLT16 relocations
The PowerPC64 ELFv2 ABI and the PowerPC SysV ABI support a number of
relocations that can be used to create and access a PLT entry.
However, the relocs are not well defined.  The PLT16 family of relocs
talk about "the section offset or address of the procedure linkage
table entry".  It's plain that we do need a relative address when PIC
as otherwise we'd have dynamic text relocations, but "section offset"
doesn't specify which section.  The most obvious one, ".plt", isn't
that useful because there is no readily available way of addressing
the start of the ".plt" section.  Much more useful would be "the
GOT/TOC-pointer relative offset of the procedure linkage table entry",
and I suppose you could argue that is a "section offset" of sorts.
For PowerPC64 it is better to use the same TOC-pointer relative
addressing even when non-PIC, since ".plt" may be located outside the
range of a 32-bit address.  However, for ppc32 we do want an absolute
address when non-PIC as a GOT pointer may not be set up.  Also, for
ppc32 PIC we have a similar situation to R_PPC_PLTREL24 in that the
GOT pointer is set to a location in the .got2 section and we need to
specify the .got2 offset in the PLT16 reloc addend.

This patch supports PLT16 relocations using these semantics.  This is
not an ABI change for ppc32 since the relocations were not previously
supported by GNU ld, but is for ppc64 where some of the PLT16 relocs
were supported.  I'm not particularly concerned since the old ppc64
PLT16 reloc semantics made them almost completely useless.

bfd/
	* elf32-ppc.c (ppc_elf_check_relocs): Handle PLT16 relocs.
	(ppc_elf_relocate_section): Likewise.
	* elf64-ppc.c (ppc64_elf_check_relocs): Handle PLT16_LO_DS.
	(ppc64_elf_relocate_section): Likewise.  Correct PLT16
	resolution to plt entry relative to toc pointer.
gold/
	* powerpc.cc (Target_powerpc::plt_off): New functions.
	(is_plt16_reloc): New function.
	(Stub_table::plt_off): Use Target_powerpc::plt_off.
	(Stub_table::plt_call_size): Use plt_off.
	(Stub_table::do_write): Likewise.
	(Target_powerpc::Scan::get_reference_flags): Return RELATIVE_REF
	for PLT16 relocations.
	(Target_powerpc::Scan::reloc_needs_plt_for_ifunc): Return true
	for PLT16 relocations.
	(Target_powerpc::Scan::global): Make a PLT entry for PLT16 relocations.
	(Target_powerpc::Relocate::relocate): Support PLT16 relocations.
	(Powerpc_scan_relocatable_reloc::global_strategy): Return RELOC_SPECIAL
	for ppc32 plt16 relocs.
2018-04-09 16:56:35 +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 PLT16 relocations 2018-04-09 16:56:35 +09:30
ChangeLog-0815
ChangeLog-2016
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 PLT16 relocations 2018-04-09 16:56:35 +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
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.