https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120391
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |INVALID Status|UNCONFIRMED |RESOLVED --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- ``` .section .rodata.str1.1,"aMS",@progbits,1 .type _ZL2c2, @object .size _ZL2c2, 7 _ZL2c2: .string "world!" .section .rodata.str1.8,"aMS",@progbits,1 .align 8 .type _ZL2c1, @object .size _ZL2c1, 13 _ZL2c1: .string "Hello world!" ``` With -fmerge-all-constants, the variables are emitted into the mergable sections. So there is nothing for GCC to do here. The problem for x86_64 ABI, since c1 is larger than 8, it has an alignment for 8. Note the `.8` in the section name there. So on aarch64 we get: ``` .section .rodata.str1.1,"aMS",@progbits,1 .type _ZL2c2, %object .size _ZL2c2, 7 _ZL2c2: .string "world!" .type _ZL2c1, %object .size _ZL2c1, 13 _ZL2c1: .string "Hello world!" ``` Which then the linker can/will merge. So this comes down to ABI requirements of x86_64.