When not using -fdata-sections or when there is no containing name, GCC falls back to a default section name. Because AIX uses XCOFF, it always has generated it's own section (CSECT) names (based on the filename) and not using the GCC defaults.
unicode.org icu code has elicited behavior from the GCC AIX backend that generates invalid code https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/tzfmt.cpp Essentially extern "C++" { namespace icu_64 { static const UChar TZID_GMT[] = {0x0045, 0x0074, 0x0063, 0x002F, 0x0047, 0x004D, 0x0054, 0}; // Etc/GMT selects a read only section whose name matches a read write section name (a CSECT with [RO] mapping matches a CSECT with [RW] mapping). The AIX linker generates an error for this combination. The current algorithm creates a single private data section name, e.g., "_tzfmt.rw_" and uses the one string for the names of both the read write and read only private data sections _tzfmt.rw_[RW] _tzfmt.rw_[RO] Apparently this combination never has been elicited previously over the 20+ years of the port. The most expedient solution is to generate a separate name for private read only data. The GCC XCOFF stabs debugging information will not be correct for this, but, if one examines the current GCC xcoffout.c logic, it never has been correct and always assumed that the section was read write. The focus for AIX is DWARF debugging and this section rarely, if ever, has been emitted. Another solution would be to place private read only data in the private read write data section when the -fdata-section logic is not active or not triggered. Thanks, David Bootstrapped on powerpc-ibm-aix7.2.0.0. * xcoffout.h (xcoff_private_rodata_section_name): Declare. * xcoffout.c (xcoff_private_rodata_section_name): Define. * config/rs6000/rs6000.c (rs6000_xcoff_asm_init_sections): Create read_only_private_data_section using xcoff_private_rodata_section_name. (rs6000_xcoff_file_start): Generate xcoff_private_rodata_section_name. Index: xcoffout.c =================================================================== --- xcoffout.c (revision 270165) +++ xcoffout.c (working copy) @@ -64,6 +64,7 @@ static const char *xcoff_current_function_file; char *xcoff_bss_section_name; char *xcoff_private_data_section_name; +char *xcoff_private_rodata_section_name; char *xcoff_tls_data_section_name; char *xcoff_tbss_section_name; char *xcoff_read_only_section_name; Index: xcoffout.h =================================================================== --- xcoffout.h (revision 270165) +++ xcoffout.h (working copy) @@ -127,6 +127,7 @@ extern const char *xcoff_current_include_file; extern char *xcoff_bss_section_name; extern char *xcoff_private_data_section_name; +extern char *xcoff_private_rodata_section_name; extern char *xcoff_tls_data_section_name; extern char *xcoff_tbss_section_name; extern char *xcoff_read_only_section_name; Index: config/rs6000/rs6000.c =================================================================== --- config/rs6000/rs6000.c (revision 270165) +++ config/rs6000/rs6000.c (working copy) @@ -33866,6 +33866,10 @@ rs6000_xcoff_asm_init_sections (void) rs6000_xcoff_output_readwrite_section_asm_op, &xcoff_private_data_section_name); + read_only_private_data_section + = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op, + &xcoff_private_rodata_section_name); + tls_data_section = get_unnamed_section (SECTION_TLS, rs6000_xcoff_output_tls_section_asm_op, @@ -33876,10 +33880,6 @@ rs6000_xcoff_asm_init_sections (void) rs6000_xcoff_output_tls_section_asm_op, &xcoff_private_data_section_name); - read_only_private_data_section - = get_unnamed_section (0, rs6000_xcoff_output_readonly_section_asm_op, - &xcoff_private_data_section_name); - toc_section = get_unnamed_section (0, rs6000_xcoff_output_toc_section_asm_op, NULL); @@ -34060,6 +34060,8 @@ rs6000_xcoff_file_start (void) main_input_filename, ".bss_"); rs6000_gen_section_name (&xcoff_private_data_section_name, main_input_filename, ".rw_"); + rs6000_gen_section_name (&xcoff_private_rodata_section_name, + main_input_filename, ".rop_"); rs6000_gen_section_name (&xcoff_read_only_section_name, main_input_filename, ".ro_"); rs6000_gen_section_name (&xcoff_tls_data_section_name,