2017-11-17 16:17:36 +08:00
|
|
|
RUN: ld.lld --version \
|
2019-08-14 20:20:21 +08:00
|
|
|
RUN: -detect-odr-violations \
|
2017-11-17 16:17:36 +08:00
|
|
|
RUN: -g \
|
2019-08-14 20:20:21 +08:00
|
|
|
RUN: -long-plt \
|
2017-11-17 16:17:36 +08:00
|
|
|
RUN: -no-add-needed \
|
|
|
|
RUN: -no-copy-dt-needed-entries \
|
|
|
|
RUN: -no-ctors-in-init-array \
|
|
|
|
RUN: -no-keep-memory \
|
2019-08-14 20:20:21 +08:00
|
|
|
RUN: -no-mmap-output-file \
|
2019-02-25 18:48:31 +08:00
|
|
|
RUN: -no-pipeline-knowledge \
|
2017-11-17 16:17:36 +08:00
|
|
|
RUN: -no-warn-mismatch \
|
2019-02-25 18:48:31 +08:00
|
|
|
RUN: -p \
|
2019-08-14 20:20:21 +08:00
|
|
|
RUN: -rpath-link . \
|
[PPC32] Improve the 32-bit PowerPC port
Many -static/-no-pie/-shared/-pie applications linked against glibc or musl
should work with this patch. This also helps FreeBSD PowerPC64 to migrate
their lib32 (PR40888).
* Fix default image base and max page size.
* Support new-style Secure PLT (see below). Old-style BSS PLT is not
implemented, so it is not suitable for FreeBSD rtld now because it doesn't
support Secure PLT yet.
* Support more initial relocation types:
R_PPC_ADDR32, R_PPC_REL16*, R_PPC_LOCAL24PC, R_PPC_PLTREL24, and R_PPC_GOT16.
The addend of R_PPC_PLTREL24 is special: it decides the call stub PLT type
but it should be ignored for the computation of target symbol VA.
* Support GNU ifunc
* Support .glink used for lazy PLT resolution in glibc
* Add a new thunk type: PPC32PltCallStub that is similar to PPC64PltCallStub.
It is used by R_PPC_REL24 and R_PPC_PLTREL24.
A PLT stub used in -fPIE/-fPIC usually loads an address relative to
.got2+0x8000 (-fpie/-fpic code uses _GLOBAL_OFFSET_TABLE_ relative
addresses).
Two .got2 sections in two object files have different addresses, thus a PLT stub
can't be shared by two object files. To handle this incompatibility,
change the parameters of Thunk::isCompatibleWith to
`const InputSection &, const Relocation &`.
PowerPC psABI specified an old-style .plt (BSS PLT) that is both
writable and executable. Linkers don't make separate RW- and RWE segments,
which causes all initially writable memory (think .data) executable.
This is a big security concern so a new PLT scheme (secure PLT) was developed to
address the security issue.
TLS will be implemented in D62940.
glibc older than ~2012 requires .rela.dyn to include .rela.plt, it can
not handle the DT_RELA+DT_RELASZ == DT_JMPREL case correctly. A hack
(not included in this patch) in LinkerScript.cpp addOrphanSections() to
work around the issue:
if (Config->EMachine == EM_PPC) {
// Older glibc assumes .rela.dyn includes .rela.plt
Add(In.RelaDyn);
if (In.RelaPlt->isLive() && !In.RelaPlt->Parent)
In.RelaDyn->getParent()->addSection(In.RelaPlt);
}
Reviewed By: ruiu
Differential Revision: https://reviews.llvm.org/D62464
llvm-svn: 362721
2019-06-07 01:03:00 +08:00
|
|
|
RUN: -secure-plt \
|
2017-11-17 16:17:36 +08:00
|
|
|
RUN: -sort-common \
|
|
|
|
RUN: -stats \
|
|
|
|
RUN: -warn-execstack \
|
|
|
|
RUN: -warn-once \
|
|
|
|
RUN: -warn-shared-textrel \
|
|
|
|
RUN: -EB \
|
|
|
|
RUN: -EL \
|
2019-08-14 20:20:21 +08:00
|
|
|
RUN: -G 0 \
|
2017-11-17 16:17:36 +08:00
|
|
|
RUN: -Qy
|
|
|
|
RUN: not ld.lld --version --not-an-ignored-argument
|