@@ -147,25 +147,27 @@ template <class ELFT>
147
147
static unsigned handleARMTlsRelocation (uint32_t Type, SymbolBody &Body,
148
148
InputSectionBase &C, uint64_t Offset,
149
149
int64_t Addend, RelExpr Expr) {
150
- auto addModuleReloc = [&](uint64_t Off, bool LD) {
151
- // The Dynamic TLS Module Index Relocation can be statically resolved to 1
152
- // if we know that the TLS Symbol is in an executable.
153
- if (!Body.isPreemptible () && !Config->Pic )
154
- In<ELFT>::Got->Relocations .push_back (
155
- {R_ABS, Target->TlsModuleIndexRel , Off, 0 , &Body});
156
- else {
157
- SymbolBody *Dest = LD ? nullptr : &Body;
158
- In<ELFT>::RelaDyn->addReloc (
159
- {Target->TlsModuleIndexRel , In<ELFT>::Got, Off, false , Dest, 0 });
160
- }
150
+ // The Dynamic TLS Module Index Relocation for a symbol defined in an
151
+ // executable is always 1. If the target Symbol is not preemtible then
152
+ // we know the offset into the TLS block at static link time.
153
+ bool NeedDynId = Body.isPreemptible () || Config->Shared ;
154
+ bool NeedDynOff = Body.isPreemptible ();
155
+
156
+ auto AddTlsReloc = [&](uint64_t Off, uint32_t Type, SymbolBody *Dest,
157
+ bool Dyn) {
158
+ if (Dyn)
159
+ In<ELFT>::RelaDyn->addReloc ({Type, In<ELFT>::Got, Off, false , Dest, 0 });
160
+ else
161
+ In<ELFT>::Got->Relocations .push_back ({R_ABS, Type, Off, 0 , Dest});
161
162
};
162
163
163
164
// Local Dynamic is for access to module local TLS variables, while still
164
165
// being suitable for being dynamically loaded via dlopen.
165
166
// GOT[e0] is the module index, with a special value of 0 for the current
166
167
// module. GOT[e1] is unused. There only needs to be one module index entry.
167
168
if (Expr == R_TLSLD_PC && In<ELFT>::Got->addTlsIndex ()) {
168
- addModuleReloc (In<ELFT>::Got->getTlsIndexOff (), true );
169
+ AddTlsReloc (In<ELFT>::Got->getTlsIndexOff (), Target->TlsModuleIndexRel ,
170
+ NeedDynId ? nullptr : &Body, NeedDynId);
169
171
C.Relocations .push_back ({Expr, Type, Offset, Addend, &Body});
170
172
return 1 ;
171
173
}
@@ -176,13 +178,9 @@ static unsigned handleARMTlsRelocation(uint32_t Type, SymbolBody &Body,
176
178
if (Expr == R_TLSGD_PC) {
177
179
if (In<ELFT>::Got->addDynTlsEntry (Body)) {
178
180
uint64_t Off = In<ELFT>::Got->getGlobalDynOffset (Body);
179
- addModuleReloc (Off, false );
180
- if (Body.isPreemptible ())
181
- In<ELFT>::RelaDyn->addReloc ({Target->TlsOffsetRel , In<ELFT>::Got,
182
- Off + Config->Wordsize , false , &Body, 0 });
183
- else
184
- In<ELFT>::Got->Relocations .push_back (
185
- {R_ABS, R_ARM_ABS32, Off + Config->Wordsize , 0 , &Body});
181
+ AddTlsReloc (Off, Target->TlsModuleIndexRel , &Body, NeedDynId);
182
+ AddTlsReloc (Off + Config->Wordsize , Target->TlsOffsetRel , &Body,
183
+ NeedDynOff);
186
184
}
187
185
C.Relocations .push_back ({Expr, Type, Offset, Addend, &Body});
188
186
return 1 ;
0 commit comments