On Feb 7, 2005, Alexandre Oliva wrote: >> The other novelty is that the offset from the (biased) TLS pointer to >> the TLS block for the main executable, if there is one, is fixed by >> the ABI, which makes the Local Exec model extremely efficient. > This last bit, in turn, required a change to the TLS offset assignment > that can benefit other ports. The existing TLS offset assignment code > assigns all offsets starting at zero, with the maximum alignment > required by the static TLS blocks. Only then does it take > TLS_PRE_TCB_SIZE into account, rounding it up to the alignment of the > static TLS block, leaving whatever padding required by this operation > unused. > The change introduced to enable the offset from the TCB to the > executable TLS block to be constant enabled the pre-tcb size and > alignment requirements to be taken into account early, such that we > can use whatever padding they might require for TLS blocks. This is > particularly useful in case some TLS segment has a very large > alignment requirement. > Also, if a TLS segment has alignment requirements no stricter than > those of the TCB, and the pre-TCB block has wider alignment > requirements than the TCB, the current code will not obtain the > correct alignment for the pre-TCB block. This actually hits in > current code, because the TCB often has 16-byte alignment, and the > pre-TCB block is declared as requiring 32-byte alignment. > The change to implement this fix was implemented by adding an argument > to a function exported by ld.so to libpthread.so. I'm not sure this > is regarded as an ABI break, since it's an internal function. It > would be simple enough to introduce a separate entry point to obtain > the same information, or version the function so as to make > incompatibilities explicit. Opinions? This patch has the changes described above. It introduces two new macros to control the behavior of dl-tls: TLS_PRE_TCB_ALIGN (that should probably be set for all DTV_AT_TP ports) and TLS_FIXED_EXEC_TCB_OFFSET_P (that is only used on FR-V). I could probably split these out into a separate patch, but they're so small and entangled with the current patch that I didn't think it was worth the trouble. It also introduces TLS_STATIC_RESERVED_SIZE, defined as an alias to TLS_PRE_TCB_SIZE unless TLS_FIXED_EXEC_TCB_OFFSET_P, in which case the offset may have to vary, and is thus defined as a macro. _dl_get_tls_static_info() gets a new argument that libc uses to communicate the amount of space reserved for the pre-tcb block, such that nptl can take it into account when allocating space for the TLS block. I have a few backward-compatibility concerns regarding this change, but since it's an internal function, I thought this might be ok.