aix: 64 bit AIX TLS libpthread dependency.
64bit XCOFF files will generated TLS access, with local-exec or global-exec models, by an access to R13. Thus, there isn't any reference to a TLS symbol. The problem is that it allows programs with TLS to be compiled and linked even without -pthread. Most of the time, it will result in a segfault when trying to access a TLS variable. But sometimes, it might create a memory corruption. This patch forces a reference to __tls_get_addr() to ensure link will fail without -pthread. gcc/ChangeLog: 2021-08-11 Clément Chigot <clement.chigot@atos.net> * config/rs6000/rs6000.c (xcoff_tls_exec_model_detected): New. (rs6000_legitimize_tls_address_aix): Use it. (rs6000_xcoff_file_end): Add ".ref __tls_get_addr" when xcoff_tls_exec_model_detected is true.
This commit is contained in:
parent
882f1d58bf
commit
34ce7f7a9a
@ -127,6 +127,9 @@ scalar_int_mode rs6000_pmode;
|
||||
bool rs6000_passes_ieee128 = false;
|
||||
#endif
|
||||
|
||||
/* Track use of r13 in 64bit AIX TLS. */
|
||||
static bool xcoff_tls_exec_model_detected = false;
|
||||
|
||||
/* Generate the manged name (i.e. U10__float128) used in GCC 8.1, and not the
|
||||
name used in current releases (i.e. u9__ieee128). */
|
||||
static bool ieee128_mangling_gcc_8_1;
|
||||
@ -9397,7 +9400,10 @@ rs6000_legitimize_tls_address_aix (rtx addr, enum tls_model model)
|
||||
emit_insn (gen_tls_get_tpointer (tlsreg));
|
||||
}
|
||||
else
|
||||
tlsreg = gen_rtx_REG (DImode, 13);
|
||||
{
|
||||
tlsreg = gen_rtx_REG (DImode, 13);
|
||||
xcoff_tls_exec_model_detected = true;
|
||||
}
|
||||
|
||||
/* Load the TOC value into temporary register. */
|
||||
tmpreg = gen_reg_rtx (Pmode);
|
||||
@ -21122,6 +21128,12 @@ rs6000_xcoff_file_end (void)
|
||||
fputs (TARGET_32BIT
|
||||
? "\t.long _section_.text\n" : "\t.llong _section_.text\n",
|
||||
asm_out_file);
|
||||
|
||||
if (xcoff_tls_exec_model_detected)
|
||||
{
|
||||
/* Add a .ref to __tls_get_addr to force libpthread dependency. */
|
||||
fputs ("\t.extern __tls_get_addr\n\t.ref __tls_get_addr\n", asm_out_file);
|
||||
}
|
||||
}
|
||||
|
||||
struct declare_alias_data
|
||||
|
Loading…
Reference in New Issue
Block a user