bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug gas/29012] gas: .set should copy st_size only if src's st_size is u


From: cvs-commit at gcc dot gnu.org
Subject: [Bug gas/29012] gas: .set should copy st_size only if src's st_size is unset
Date: Mon, 04 Apr 2022 15:45:25 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=29012

--- Comment #2 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot 
gnu.org> ---
The master branch has been updated by Fangrui Song <maskray@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=867b8c308a40e79f90db4051cafc273f00f881fb

commit 867b8c308a40e79f90db4051cafc273f00f881fb
Author: Fangrui Song <i@maskray.me>
Date:   Mon Apr 4 08:43:50 2022 -0700

    gas: copy st_size only if unset

    For
    ```
    .size foo1, 1
    foo1:

    .set bar1, foo1
    .size bar1, 2
    .size bar2, 2
    .set bar2, foo1

    .set bar3, foo2
    .size bar3, 2
    .size bar4, 2
    .set bar4, foo2

    .size foo2, 1
    foo2:
    ```

    bar1's size is 2 while bar2, bar3, bar4's is 1. The behavior of bar1 makes
sense
    (generally directives on the new symbol should win) and is relied upon by
glibc
    stdio-common/errlist.c:

    ```
            .hidden _sys_errlist_internal
            .globl  _sys_errlist_internal
            .type   _sys_errlist_internal, @object
            .size   _sys_errlist_internal, 1072
    _sys_errlist_internal:

            .globl __GLIBC_2_1_sys_errlist
            .set __GLIBC_2_1_sys_errlist, _sys_errlist_internal
            .type __GLIBC_2_1_sys_errlist, %object
            .size __GLIBC_2_1_sys_errlist, 125 * (64 / 8)

    // glibc expects that .size __GLIBC_2_1_sys_errlist, 125 * (64 / 8) wins.
    ```

    The behavior of bar2/bar3/bar4 seems brittle. To avoid the reordering of
the two
    code blocks which will result in the bar3 situation, glibc compiles
errlist.c
    with gcc -fno-toplevel-reorder (previously -fno-unit-at-a-time).

    To fix the inconsistency and improve robustness, make bar2/bar3/bar4 match
bar1,
    removing the directive order sensitivity.

    There is a pity that `.size dest, 0` is indistinguishable from the case
where
    dest is unset, but the compromise seems fine.

        PR gas/29012
        * config/obj-elf.c (elf_copy_symbol_attributes): don't copy if src's
size
          has been set.
        * testsuite/gas/elf/elf.exp: New test.
        * testsuite/gas/elf/size.d: New file.
        * testsuite/gas/elf/size.s: Likewise.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]