Skip to content

Commit 3482106

Browse files
committed
[AAELF64] TLS GOT generating relocations must have 0 addend.
Bring TLS GOT generating relocations in line with non GOT generating relocations in #272. The ABI rule is that static linkers should generate a GOT entry for each unique tuple of (S,A). However static linkers such as GNU ld and lld only generate a unique entry per unique S, and handle A inconsistently. With GNU ld ignoring A and lld adding it after. The only consistent behaviour between implementations is when A is 0.
1 parent 92cd879 commit 3482106

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

aaelf64/aaelf64.rst

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ changes to the content of the document for that release.
287287
| next | tbd | - In `Section Attribute Flags`_, added |
288288
| | | `SHF_AARCH64_PURECODE` processor |
289289
| | | specific section attribute flag. |
290+
| | | - Clarify use of addends in GOT |
291+
| | | generating static TLS relocations. |
290292
+---------------+--------------------+-----------------------------------------+
291293

292294
References
@@ -1483,6 +1485,7 @@ In addition to the terms defined in `Relocation types`_, the tables listing the
14831485

14841486
- ``TLSDESC(S+A)`` resolves to a contiguous pair of pointer-sized values, as created by ``GTLSDESC(S+A)``.
14851487

1488+
Relocations using the operations ``GTLSDESC(S)``, ``GTPREL(S)`` and ``GTLSIDX(S)`` relocations must have a zero addend. Previous versions of this document included the addend ``A`` in ``Operation(S + A)`` where Operation is one of ``GTLSDESC,``, ``GTPREL`` and ``GTLSIDX``. This results in a GOT entry, or pair of entries for ``S + A``. With a zero addend ``Operation(S + 0)`` is equivalent to ``Operation(S)`` and ``Operation(S) + 0``.
14861489

14871490
General Dynamic thread-local storage model
14881491
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1494,15 +1497,15 @@ General Dynamic thread-local storage model
14941497
+------------+------------+---------------------------------+---------------------------------+------------------------------------------------------------------------------------------+
14951498
| ELF64 Code | ELF32 Code | Name | Operation | Comment |
14961499
+============+============+=================================+=================================+==========================================================================================+
1497-
| 512 | 80 | R\_<CLS>\_TLSGD\_ ADR\_PREL21 | G(GTLSIDX(S,A)) - P | Set an ADR immediate field to bits [20:0] of X; check –2\ :sup:`20` <= X < 2\ :sup:`20` |
1500+
| 512 | 80 | R\_<CLS>\_TLSGD\_ ADR\_PREL21 | G(GTLSIDX(S)) - P | Set an ADR immediate field to bits [20:0] of X; check –2\ :sup:`20` <= X < 2\ :sup:`20` |
14981501
+------------+------------+---------------------------------+---------------------------------+------------------------------------------------------------------------------------------+
1499-
| 513 | 81 | R\_<CLS>\_TLSGD\_ ADR\_PAGE21 | Page(G(GTLSIDX(S,A)) - Page(P) | Set an ADRP immediate field to bits [32:12] of X; check –2\ :sup:`32` <= X < 2\ :sup:`32`|
1502+
| 513 | 81 | R\_<CLS>\_TLSGD\_ ADR\_PAGE21 | Page(G(GTLSIDX(S)) - Page(P) | Set an ADRP immediate field to bits [32:12] of X; check –2\ :sup:`32` <= X < 2\ :sup:`32`|
15001503
+------------+------------+---------------------------------+---------------------------------+------------------------------------------------------------------------------------------+
1501-
| 514 | 82 | R\_<CLS>\_TLSGD\_ ADD\_LO12\_NC | G(GTLSIDX(S,A)) | Set an ADD immediate field to bits [11:0] of X. No overflow check |
1504+
| 514 | 82 | R\_<CLS>\_TLSGD\_ ADD\_LO12\_NC | G(GTLSIDX(S)) | Set an ADD immediate field to bits [11:0] of X. No overflow check |
15021505
+------------+------------+---------------------------------+---------------------------------+------------------------------------------------------------------------------------------+
1503-
| 515 | \- | R\_<CLS>\_TLSGD\_ MOVW\_G1 | G(GTLSIDX(S,A)) - GOT | Set a MOV[NZ] immediate field to bits [31:16] of X (see notes below) |
1506+
| 515 | \- | R\_<CLS>\_TLSGD\_ MOVW\_G1 | G(GTLSIDX(S)) - GOT | Set a MOV[NZ] immediate field to bits [31:16] of X (see notes below) |
15041507
+------------+------------+---------------------------------+---------------------------------+------------------------------------------------------------------------------------------+
1505-
| 516 | \- | R\_<CLS>\_TLSGD\_ MOVW\_G0\_NC | G(GTLSIDX(S,A)) - GOT | Set a MOVK immediate field to bits [15:0] of X. No overflow check |
1508+
| 516 | \- | R\_<CLS>\_TLSGD\_ MOVW\_G0\_NC | G(GTLSIDX(S)) - GOT | Set a MOVK immediate field to bits [15:0] of X. No overflow check |
15061509
+------------+------------+---------------------------------+---------------------------------+------------------------------------------------------------------------------------------+
15071510

15081511
.. note::
@@ -1594,17 +1597,17 @@ Initial Exec thread-local storage model
15941597
+------------+------------+--------------------------------------------+--------------------------------+------------------------------------------------------------------------------------------+
15951598
| ELF64 Code | ELF32 Code | Name | Operation | Comment |
15961599
+============+============+============================================+================================+==========================================================================================+
1597-
| 539 | \- | R\_<CLS>\_TLSIE\_ MOVW\_GOTTPREL\_G1 | G(GTPREL(S+A)) - GOT | Set a MOV[NZ] immediate field to bits [31:16] of X (see notes below) |
1600+
| 539 | \- | R\_<CLS>\_TLSIE\_ MOVW\_GOTTPREL\_G1 | G(GTPREL(S)) - GOT | Set a MOV[NZ] immediate field to bits [31:16] of X (see notes below) |
15981601
+------------+------------+--------------------------------------------+--------------------------------+------------------------------------------------------------------------------------------+
1599-
| 540 | \- | R\_<CLS>\_TLSIE\_ MOVW\_GOTTPREL\_G0\_NC | G(GTPREL(S+A)) - GOT | Set MOVK immediate to bits [15:0] of X. No overflow check |
1602+
| 540 | \- | R\_<CLS>\_TLSIE\_ MOVW\_GOTTPREL\_G0\_NC | G(GTPREL(S)) - GOT | Set MOVK immediate to bits [15:0] of X. No overflow check |
16001603
+------------+------------+--------------------------------------------+--------------------------------+------------------------------------------------------------------------------------------+
1601-
| 541 | 103 | R\_<CLS>\_TLSIE\_ ADR\_GOTTPREL\_PAGE21 | Page(G(GTPREL(S+A))) - Page(P) | Set an ADRP immediate field to bits [32:12] of X; check –2\ :sup:`32` <= X < 2\ :sup:`32`|
1604+
| 541 | 103 | R\_<CLS>\_TLSIE\_ ADR\_GOTTPREL\_PAGE21 | Page(G(GTPREL(S))) - Page(P) | Set an ADRP immediate field to bits [32:12] of X; check –2\ :sup:`32` <= X < 2\ :sup:`32`|
16021605
+------------+------------+--------------------------------------------+--------------------------------+------------------------------------------------------------------------------------------+
1603-
| 542 | \- | R\_<CLS>\_TLSIE\_ LD64\_GOTTPREL\_LO12\_NC | G(GTPREL(S+A)) | Set an LD offset field to bits [11:3] of X. No overflow check; check that X&7=0 |
1606+
| 542 | \- | R\_<CLS>\_TLSIE\_ LD64\_GOTTPREL\_LO12\_NC | G(GTPREL(S)) | Set an LD offset field to bits [11:3] of X. No overflow check; check that X&7=0 |
16041607
+------------+------------+--------------------------------------------+--------------------------------+------------------------------------------------------------------------------------------+
1605-
| \- | 104 | R\_<CLS>\_TLSIE\_ LD32\_GOTTPREL\_LO12\_NC | G(GTPREL(S+A)) | Set an LD offset field to bits [11:2] of X. No overflow check; check that X&3=0 |
1608+
| \- | 104 | R\_<CLS>\_TLSIE\_ LD32\_GOTTPREL\_LO12\_NC | G(GTPREL(S)) | Set an LD offset field to bits [11:2] of X. No overflow check; check that X&3=0 |
16061609
+------------+------------+--------------------------------------------+--------------------------------+------------------------------------------------------------------------------------------+
1607-
| 543 | 105 | R\_<CLS>\_TLSIE\_ LD\_GOTTPREL\_PREL19 | G(GTPREL(S+A)) – P | Set a load-literal immediate to bits [20:2] of X; check –2\ :sup:`20` <= X < 2\ :sup:`20`|
1610+
| 543 | 105 | R\_<CLS>\_TLSIE\_ LD\_GOTTPREL\_PREL19 | G(GTPREL(S)) – P | Set a load-literal immediate to bits [20:2] of X; check –2\ :sup:`20` <= X < 2\ :sup:`20`|
16081611
+------------+------------+--------------------------------------------+--------------------------------+------------------------------------------------------------------------------------------+
16091612

16101613
.. note::
@@ -1675,23 +1678,23 @@ Thread-local storage descriptors
16751678
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
16761679
| ELF64 Code | ELF32 Code | Name | Operation | Comment |
16771680
+============+============+=================================+==================================+==============================================================================================+
1678-
| 560 | 122 | R\_<CLS>\_TLSDESC\_ LD\_PREL19 | G(GTLSDESC(S+A)) - P | Set a load-literal immediate to bits [20:2]; check -2\ :sup:`20` <= X < 2\ :sup:`20`; check |
1681+
| 560 | 122 | R\_<CLS>\_TLSDESC\_ LD\_PREL19 | G(GTLSDESC(S)) - P | Set a load-literal immediate to bits [20:2]; check -2\ :sup:`20` <= X < 2\ :sup:`20`; check |
16791682
| | | | | X & 3 = 0. |
16801683
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
1681-
| 561 | 123 | R\_<CLS>\_TLSDESC\_ ADR\_PREL21 | G(GTLSDESC(S+A)) - P | Set an ADR immediate field to bits [20:0]; check -2\ :sup:`20` <= X < 2\ :sup:`20`. |
1684+
| 561 | 123 | R\_<CLS>\_TLSDESC\_ ADR\_PREL21 | G(GTLSDESC(S)) - P | Set an ADR immediate field to bits [20:0]; check -2\ :sup:`20` <= X < 2\ :sup:`20`. |
16821685
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
1683-
| 562 | 124 | R\_<CLS>\_TLSDESC\_ ADR\_PAGE21 | Page(G(GTLSDESC(S+A))) - Page(P) | Set an ADRP immediate field to bits [32:12] of X; check -2\ :sup:`32` <= X < 2\ :sup:`32`. |
1686+
| 562 | 124 | R\_<CLS>\_TLSDESC\_ ADR\_PAGE21 | Page(G(GTLSDESC(S))) - Page(P) | Set an ADRP immediate field to bits [32:12] of X; check -2\ :sup:`32` <= X < 2\ :sup:`32`. |
16841687
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
1685-
| 563 | \- | R\_<CLS>\_TLSDESC\_ LD64\_LO12 | G(GTLSDESC(S+A)) | Set an LD offset field to bits [11:3] of X. No overflow check; check X & 7 = 0. |
1688+
| 563 | \- | R\_<CLS>\_TLSDESC\_ LD64\_LO12 | G(GTLSDESC(S)) | Set an LD offset field to bits [11:3] of X. No overflow check; check X & 7 = 0. |
16861689
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
1687-
| \- | 125 | R\_<CLS>\_TLSDESC\_ LD32\_LO12 | G(GTLSDESC(S+A)) | Set an LD offset field to bits [11:2] of X. No overflow check; check X & 3 = 0. |
1690+
| \- | 125 | R\_<CLS>\_TLSDESC\_ LD32\_LO12 | G(GTLSDESC(S)) | Set an LD offset field to bits [11:2] of X. No overflow check; check X & 3 = 0. |
16881691
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
1689-
| 564 | 126 | R\_<CLS>\_TLSDESC\_ ADD\_LO12 | G(GTLSDESC(S+A)) | Set an ADD immediate field to bits [11:0] of X. No overflow check. |
1692+
| 564 | 126 | R\_<CLS>\_TLSDESC\_ ADD\_LO12 | G(GTLSDESC(S)) | Set an ADD immediate field to bits [11:0] of X. No overflow check. |
16901693
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
1691-
| 565 | \- | R\_<CLS>\_TLSDESC\_ OFF\_G1 | G(GTLSDESC(S+A)) - GOT | Set a MOV[NZ] immediate field to bits [31:16] of X; check -2\ :sup:`32` <= X < 2\ :sup:`32`. |
1694+
| 565 | \- | R\_<CLS>\_TLSDESC\_ OFF\_G1 | G(GTLSDESC(S)) - GOT | Set a MOV[NZ] immediate field to bits [31:16] of X; check -2\ :sup:`32` <= X < 2\ :sup:`32`. |
16921695
| | | | | See notes below. |
16931696
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
1694-
| 566 | \- | R\_<CLS>\_TLSDESC\_ OFF\_G0\_NC | G(GTLSDESC(S+A)) - GOT | Set a MOVK immediate field to bits [15:0] of X. No overflow check. |
1697+
| 566 | \- | R\_<CLS>\_TLSDESC\_ OFF\_G0\_NC | G(GTLSDESC(S)) - GOT | Set a MOVK immediate field to bits [15:0] of X. No overflow check. |
16951698
+------------+------------+---------------------------------+----------------------------------+----------------------------------------------------------------------------------------------+
16961699
| 567 | \- | R\_<CLS>\_TLSDESC\_ LDR | None | For relaxation only. Must be used to identify an LDR instruction which loads the TLS |
16971700
| | | | | descriptor function pointer for S + A if it has no other relocation. |

0 commit comments

Comments
 (0)