Turn ___brk_addr into a compat symbol

Message ID mvmy2ixab7e.fsf@suse.de
State Superseded
Headers
Series Turn ___brk_addr into a compat symbol |

Commit Message

Andreas Schwab Nov. 19, 2020, 10:32 a.m. UTC
  GCC hasn't been requiring the ___brk_addr symbol since 3.1, and before
that only on i386 at least since 2.95.
---
 sysdeps/mach/hurd/brk.c                     | 5 ++++-
 sysdeps/unix/sysv/linux/generic/brk.c       | 5 ++++-
 sysdeps/unix/sysv/linux/i386/brk.c          | 5 ++++-
 sysdeps/unix/sysv/linux/ia64/brk.S          | 5 ++++-
 sysdeps/unix/sysv/linux/m68k/brk.c          | 5 ++++-
 sysdeps/unix/sysv/linux/microblaze/brk.c    | 5 ++++-
 sysdeps/unix/sysv/linux/mips/brk.c          | 5 ++++-
 sysdeps/unix/sysv/linux/s390/brk.c          | 5 ++++-
 sysdeps/unix/sysv/linux/sparc/sparc32/brk.c | 5 ++++-
 9 files changed, 36 insertions(+), 9 deletions(-)
  

Comments

Florian Weimer Nov. 19, 2020, 11:34 a.m. UTC | #1
* Andreas Schwab:

> GCC hasn't been requiring the ___brk_addr symbol since 3.1, and before
> that only on i386 at least since 2.95.

GCC 2.7.2.3 uses it as well on i386.

I think turning it into a compatibility symbol will prevent users from
using these compilers to link new binaries.
  
Adhemerval Zanella Netto Nov. 19, 2020, 12:25 p.m. UTC | #2
On 19/11/2020 08:34, Florian Weimer wrote:
> * Andreas Schwab:
> 
>> GCC hasn't been requiring the ___brk_addr symbol since 3.1, and before
>> that only on i386 at least since 2.95.
> 
> GCC 2.7.2.3 uses it as well on i386.
> 
> I think turning it into a compatibility symbol will prevent users from
> using these compilers to link new binaries.
> 

Is this really a wide deployed scenario? And do we really care for that
awkward combination (a 20 years old compiler using an update runtime)?
  
Florian Weimer Nov. 19, 2020, 2:57 p.m. UTC | #3
* Adhemerval Zanella via Libc-alpha:

> On 19/11/2020 08:34, Florian Weimer wrote:
>> * Andreas Schwab:
>> 
>>> GCC hasn't been requiring the ___brk_addr symbol since 3.1, and before
>>> that only on i386 at least since 2.95.
>> 
>> GCC 2.7.2.3 uses it as well on i386.
>> 
>> I think turning it into a compatibility symbol will prevent users from
>> using these compilers to link new binaries.
>> 
>
> Is this really a wide deployed scenario?

Widely deployed is relative, especially in a glibc context with its
long list of supported targets.

> And do we really care for that awkward combination (a 20 years old
> compiler using an update runtime)?

GCC 2.7.2.3 is a bit of an outlier because the old Debian binaries
didn't run anymore because of a regression introduced in 1998 that was
only fixed last year.

For GCC 2.95, I have seen users building new programs with it quite
recently (although only reproducers for bugs in new glibc versions).

These early GCC versions have different C++ ABIs and accept language
constructs rejected by current compilers.  GCC 2.95 has been really
solid, so I guess those factors conspire to keep it around.
  

Patch

diff --git a/sysdeps/mach/hurd/brk.c b/sysdeps/mach/hurd/brk.c
index 02fdefd4b7..711167bebb 100644
--- a/sysdeps/mach/hurd/brk.c
+++ b/sysdeps/mach/hurd/brk.c
@@ -20,6 +20,7 @@ 
 #include <hurd/resource.h>
 #include <lock-intern.h>	/* For `struct mutex'.  */
 #include <vm_param.h>
+#include <shlib-compat.h>
 
 
 /* Initial maximum size of the data segment (this is arbitrary).  */
@@ -33,10 +34,12 @@  vm_address_t _hurd_data_end;
    Pages beyond the one containing this address allow no access.  */
 vm_address_t _hurd_brk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* This name is used by the Linux crtbeginS.o for reasons you don't even
    want to think about it.  It's just easier to provide some definition for
    it than even to explain the braindamage involved.  */
-weak_alias (_hurd_brk, ___brk_addr)
+compat_symbol (libc, _hurd_brk, ___brk_addr, GLIBC_2_0);
+#endif
 
 struct mutex _hurd_brk_lock;
 
diff --git a/sysdeps/unix/sysv/linux/generic/brk.c b/sysdeps/unix/sysv/linux/generic/brk.c
index 40a80ab970..0c12b3a487 100644
--- a/sysdeps/unix/sysv/linux/generic/brk.c
+++ b/sysdeps/unix/sysv/linux/generic/brk.c
@@ -19,14 +19,17 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 /* This must be initialized data because commons can't have aliases.  */
 void *__curbrk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
    to work around different old braindamage in the old Linux ELF dynamic
    linker.  */
-weak_alias (__curbrk, ___brk_addr)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0);
+#endif
 
 int
 __brk (void *addr)
diff --git a/sysdeps/unix/sysv/linux/i386/brk.c b/sysdeps/unix/sysv/linux/i386/brk.c
index 021b6d37a0..2e56a8a9eb 100644
--- a/sysdeps/unix/sysv/linux/i386/brk.c
+++ b/sysdeps/unix/sysv/linux/i386/brk.c
@@ -24,14 +24,17 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 /* This must be initialized data because commons can't have aliases.  */
 void *__curbrk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
    to work around different old braindamage in the old Linux ELF dynamic
    linker.  */
-weak_alias (__curbrk, ___brk_addr)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0);
+#endif
 
 int
 __brk (void *addr)
diff --git a/sysdeps/unix/sysv/linux/ia64/brk.S b/sysdeps/unix/sysv/linux/ia64/brk.S
index 734d3467a7..3e643fa745 100644
--- a/sysdeps/unix/sysv/linux/ia64/brk.S
+++ b/sysdeps/unix/sysv/linux/ia64/brk.S
@@ -19,6 +19,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 #include <asm/errno.h>
 
@@ -30,7 +31,9 @@ 
 __curbrk:
 	data8	0
 
-weak_alias (__curbrk, ___brk_addr)
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0)
+#endif
 
 LEAF(__brk)
 	.regstk 1, 0, 0, 0
diff --git a/sysdeps/unix/sysv/linux/m68k/brk.c b/sysdeps/unix/sysv/linux/m68k/brk.c
index ee88acbdc4..ae5b260ee2 100644
--- a/sysdeps/unix/sysv/linux/m68k/brk.c
+++ b/sysdeps/unix/sysv/linux/m68k/brk.c
@@ -19,13 +19,16 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 void *__curbrk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
    to work around different old braindamage in the old Linux/x86 ELF
    dynamic linker.  Sigh.  */
-weak_alias (__curbrk, ___brk_addr)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0);
+#endif
 
 int
 __brk (void *addr)
diff --git a/sysdeps/unix/sysv/linux/microblaze/brk.c b/sysdeps/unix/sysv/linux/microblaze/brk.c
index 20c3e625e4..c41fbbf03a 100644
--- a/sysdeps/unix/sysv/linux/microblaze/brk.c
+++ b/sysdeps/unix/sysv/linux/microblaze/brk.c
@@ -18,14 +18,17 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 /* This must be initialized data because commons can't have aliases.  */
 void *__curbrk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
    to work around different old braindamage in the old Linux ELF dynamic
    linker.  */
-weak_alias (__curbrk, ___brk_addr)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0);
+#endif
 
 int
 __brk (void *addr)
diff --git a/sysdeps/unix/sysv/linux/mips/brk.c b/sysdeps/unix/sysv/linux/mips/brk.c
index 0335837948..20d4be0e7c 100644
--- a/sysdeps/unix/sysv/linux/mips/brk.c
+++ b/sysdeps/unix/sysv/linux/mips/brk.c
@@ -19,13 +19,16 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 void *__curbrk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
    to work around different old braindamage in the old Linux/x86 ELF
    dynamic linker.  Sigh.  */
-weak_alias (__curbrk, ___brk_addr)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0);
+#endif
 
 int
 __brk (void *addr)
diff --git a/sysdeps/unix/sysv/linux/s390/brk.c b/sysdeps/unix/sysv/linux/s390/brk.c
index ca3a730f83..948d97fec8 100644
--- a/sysdeps/unix/sysv/linux/s390/brk.c
+++ b/sysdeps/unix/sysv/linux/s390/brk.c
@@ -20,13 +20,16 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 void *__curbrk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
    to work around different old braindamage in the old Linux/x86 ELF
    dynamic linker.  Sigh.  */
-weak_alias (__curbrk, ___brk_addr)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0);
+#endif
 
 int
 __brk (void *addr)
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
index ba9a616f74..bbaf7876c2 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c
@@ -20,14 +20,17 @@ 
 #include <errno.h>
 #include <unistd.h>
 #include <sysdep.h>
+#include <shlib-compat.h>
 
 /* This must be initialized data because commons can't have aliases.  */
 void *__curbrk = 0;
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_33)
 /* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
    to work around different old braindamage in the old Linux ELF dynamic
    linker.  */
-weak_alias (__curbrk, ___brk_addr)
+compat_symbol (libc, __curbrk, ___brk_addr, GLIBC_2_0);
+#endif
 
 int
 __brk (void *addr)