]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Avoid padding in _init and _fini. [BZ #31042]
authorStefan Liebler <stli@linux.ibm.com>
Tue, 21 Nov 2023 12:33:03 +0000 (13:33 +0100)
committerStefan Liebler <stli@linux.ibm.com>
Thu, 30 Nov 2023 12:31:23 +0000 (13:31 +0100)
The linker just concatenates the .init and .fini sections which
results in the complete _init and _fini functions. If needed the
linker adds padding bytes due to an alignment. GNU ld is adding
NOPs, which is fine.  But e.g. mold is adding traps which results
in broken _init and _fini functions.

Thus this patch removes the alignment in .init and .fini sections
in crtn.S files.

We keep the 4 byte function alignment in crti.S files. As the
assembler now also outputs the start of _init and _fini functions
as multiples of 4 byte, it perhaps has to fill it. Although GNU as
is using NOPs here, to be sure, we just keep the alignment with
0x07 (=NOPs) at the end of crti.S.

In order to avoid an obvious NOP slide in _fini, this patch also
uses an lg instead of lgr instruction. Then the emitted instructions
needs a multiple of 4 bytes.

sysdeps/s390/s390-64/crti.S
sysdeps/s390/s390-64/crtn.S

index 11ab75e8d95f86ff225f84673715ff457e8b63cd..4c8246da26a347f3e03f096a47cbb50a79848001 100644 (file)
@@ -85,7 +85,7 @@ _init:
        .type   _fini,@function
 _fini:
        stmg    %r6,%r15,48(%r15)
-       lgr     %r1,%r15
+       lg      %r1,120(%r15)
        aghi    %r15,-160
        stg     %r1,0(%r15)
        larl    %r12,_GLOBAL_OFFSET_TABLE_
index 0eabcb346caa843a4657c3fb23739bd7bf166091..6bb1bc9dcf339d48ee1e31572efebabc5f2543b6 100644 (file)
    corresponding to the prologues in crti.S. */
 
        .section .init
-       .align  4
        lg      %r4,272(%r15)
        lmg     %r6,%r15,208(%r15)
        br      %r4
 
        .section .fini
-       .align  4
        lg      %r4,272(%r15)
        lmg     %r6,%r15,208(%r15)
        br      %r4