Hi David, The fact that csect .data is referencing csect .text doesn't mean that if .text is kept, .data is kept too. It means the opposite. if .data is kept then .text must be kept.
That's actually what is being done by the linker with the TLS support test in configure. $ cat test.c __thread int a; int b; int main() { return a = b; } With ".ref __tls_get_addr" in .data: $ gcc -maix64 test.c -S -o test.s $ cat test.s ... _section_.text: .csect .data[RW],4 .llong _section_.text .extern __tls_get_addr .ref __tls_get_addr $ gcc -maix64 test.s -o test $ dump -X64 -tv test ... [142] m 0x00000097 debug 0 FILE C:PPC64 test.c [143] m 0x100006c0 .text 1 unamex .text [144] a4 0x0000005c 0 0 SD PR - - [147] m 0x20001298 .bss 1 extern b [148] a4 0x00000004 0 0 CM BS - - [149] m 0xffffffffffff8800 .tbss 1 extern a [150] a4 0x00000004 0 0 CM UL - - ... Csect .data is garbage-collected by the linker. Thus the .ref doesn't matter. With ".ref __tls_get_addr" in .text: $ cat test.s _section_.text: .csect .data[RW],4 .llong _section_.text .csect .text[PR],5 .extern __tls_get_addr .ref __tls_get_addr $ gcc -maix64 test.s -o test ld: 0711-317 ERROR: Undefined symbol: __tls_get_addr ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information. collect2: error: ld returned 8 exit status As csect .text is kept (because of main function), the .ref is still there and the error is raise correctly. As "-pthread" isn't passed, __tls_get_addr is not available. However, writing this mail, I'm wondering if we don't want to always keep both csects. If .data is kept, then .text is and if .text is kept, then .data is. Or always keeping .data would have too much side effects ? Thanks, Clément ________________________________ From: David Edelsohn <dje....@gmail.com> Sent: Thursday, October 14, 2021 3:42 PM To: CHIGOT, CLEMENT <clement.chi...@atos.net> Cc: gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org> Subject: Re: [PATCH] aix: ensure reference to __tls_get_addr is in text section. Caution! External email. Do not open attachments or click links, unless this email comes from a known sender and you know the content is safe. The reference to __tls_get_addr is in the data section. And the code just above creates a symbol in the text section referenced from the data section to ensure the text section is retained. So this change doesn't make sense. You're essentially saying that the data section is not used, which makes the other code useless to ensure that the text section is referenced. Thanks, David On Thu, Oct 14, 2021 at 3:06 AM CHIGOT, CLEMENT <clement.chi...@atos.net> wrote: > > The garbage collector of AIX linker might remove the reference to > __tls_get_addr if it's added inside an unused csect. > > > Clément Chigot > ATOS Bull SAS > 1 rue de Provence - 38432 Échirolles - France >