LoongArch: Use medium cmodel build libc_nonshared.a.

Message ID 20221123070905.1618136-1-caiyinyu@loongson.cn
State Superseded
Headers
Series LoongArch: Use medium cmodel build libc_nonshared.a. |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

caiyinyu Nov. 23, 2022, 7:09 a.m. UTC
  From: Chenghua Xu <xuchenghua@loongson.cn>

This patch is used to fix address out-of-bounds error when building
firefox.
---
 sysdeps/loongarch/Makefile               | 18 ++++++++++++++++++
 sysdeps/loongarch/at_quick_exit.c        |  1 +
 sysdeps/loongarch/atexit.c               |  1 +
 sysdeps/loongarch/elf-init.c             |  1 +
 sysdeps/loongarch/fstat.c                |  1 +
 sysdeps/loongarch/fstat64.c              |  1 +
 sysdeps/loongarch/fstatat.c              |  1 +
 sysdeps/loongarch/fstatat64.c            |  1 +
 sysdeps/loongarch/lstat.c                |  1 +
 sysdeps/loongarch/lstat64.c              |  1 +
 sysdeps/loongarch/mknod.c                |  1 +
 sysdeps/loongarch/mknodat.c              |  1 +
 sysdeps/loongarch/pthread_atfork.c       |  1 +
 sysdeps/loongarch/stack_chk_fail_local.c |  1 +
 sysdeps/loongarch/stat.c                 |  1 +
 sysdeps/loongarch/stat64.c               |  1 +
 sysdeps/loongarch/warning-nop.c          |  1 +
 17 files changed, 34 insertions(+)
 create mode 100644 sysdeps/loongarch/at_quick_exit.c
 create mode 100644 sysdeps/loongarch/atexit.c
 create mode 100644 sysdeps/loongarch/elf-init.c
 create mode 100644 sysdeps/loongarch/fstat.c
 create mode 100644 sysdeps/loongarch/fstat64.c
 create mode 100644 sysdeps/loongarch/fstatat.c
 create mode 100644 sysdeps/loongarch/fstatat64.c
 create mode 100644 sysdeps/loongarch/lstat.c
 create mode 100644 sysdeps/loongarch/lstat64.c
 create mode 100644 sysdeps/loongarch/mknod.c
 create mode 100644 sysdeps/loongarch/mknodat.c
 create mode 100644 sysdeps/loongarch/pthread_atfork.c
 create mode 100644 sysdeps/loongarch/stack_chk_fail_local.c
 create mode 100644 sysdeps/loongarch/stat.c
 create mode 100644 sysdeps/loongarch/stat64.c
 create mode 100644 sysdeps/loongarch/warning-nop.c
  

Comments

Xi Ruoyao Nov. 23, 2022, 8:21 a.m. UTC | #1
On Wed, 2022-11-23 at 15:09 +0800, caiyinyu wrote:
> From: Chenghua Xu <xuchenghua@loongson.cn>
> 
> This patch is used to fix address out-of-bounds error when building
> firefox.

This can be much simpler:

diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile
index 746d4c2c8f..3822eb3df1 100644
--- a/sysdeps/loongarch/Makefile
+++ b/sysdeps/loongarch/Makefile
@@ -5,3 +5,7 @@ endif
 # LoongArch's assembler also needs to know about PIC as it changes the
 # definition of some assembler macros.
 ASFLAGS-.os += $(pic-ccflag)
+
+# All the objects in lib*_nonshared.a need to be compiled with medium code
+# model or large applications may fail to link.
+CFLAGS-.oS += -mcmodel=medium

And we need a check in configure.ac: GCC 12 does not support -
mcmodel=medium.

A remaining question: should we use -mcmodel=extreme here?  I guess one
day we'll see an extra large application which cannot be linked with
even medium code model...

> ---
>  sysdeps/loongarch/Makefile               | 18 ++++++++++++++++++
>  sysdeps/loongarch/at_quick_exit.c        |  1 +
>  sysdeps/loongarch/atexit.c               |  1 +
>  sysdeps/loongarch/elf-init.c             |  1 +
>  sysdeps/loongarch/fstat.c                |  1 +
>  sysdeps/loongarch/fstat64.c              |  1 +
>  sysdeps/loongarch/fstatat.c              |  1 +
>  sysdeps/loongarch/fstatat64.c            |  1 +
>  sysdeps/loongarch/lstat.c                |  1 +
>  sysdeps/loongarch/lstat64.c              |  1 +
>  sysdeps/loongarch/mknod.c                |  1 +
>  sysdeps/loongarch/mknodat.c              |  1 +
>  sysdeps/loongarch/pthread_atfork.c       |  1 +
>  sysdeps/loongarch/stack_chk_fail_local.c |  1 +
>  sysdeps/loongarch/stat.c                 |  1 +
>  sysdeps/loongarch/stat64.c               |  1 +
>  sysdeps/loongarch/warning-nop.c          |  1 +
>  17 files changed, 34 insertions(+)
>  create mode 100644 sysdeps/loongarch/at_quick_exit.c
>  create mode 100644 sysdeps/loongarch/atexit.c
>  create mode 100644 sysdeps/loongarch/elf-init.c
>  create mode 100644 sysdeps/loongarch/fstat.c
>  create mode 100644 sysdeps/loongarch/fstat64.c
>  create mode 100644 sysdeps/loongarch/fstatat.c
>  create mode 100644 sysdeps/loongarch/fstatat64.c
>  create mode 100644 sysdeps/loongarch/lstat.c
>  create mode 100644 sysdeps/loongarch/lstat64.c
>  create mode 100644 sysdeps/loongarch/mknod.c
>  create mode 100644 sysdeps/loongarch/mknodat.c
>  create mode 100644 sysdeps/loongarch/pthread_atfork.c
>  create mode 100644 sysdeps/loongarch/stack_chk_fail_local.c
>  create mode 100644 sysdeps/loongarch/stat.c
>  create mode 100644 sysdeps/loongarch/stat64.c
>  create mode 100644 sysdeps/loongarch/warning-nop.c
> 
> diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile
> index 746d4c2c8f..ccda57e2d4 100644
> --- a/sysdeps/loongarch/Makefile
> +++ b/sysdeps/loongarch/Makefile
> @@ -5,3 +5,21 @@ endif
>  # LoongArch's assembler also needs to know about PIC as it changes
> the
>  # definition of some assembler macros.
>  ASFLAGS-.os += $(pic-ccflag)
> +
> +CFLAGS-elf-init.oS += -mcmodel=medium
> +CFLAGS-atexit.oS += -mcmodel=medium
> +CFLAGS-at_quick_exit.oS += -mcmodel=medium
> +CFLAGS-stat.oS += -mcmodel=medium
> +CFLAGS-fstat.oS += -mcmodel=medium
> +CFLAGS-lstat.oS += -mcmodel=medium
> +CFLAGS-stat64.oS += -mcmodel=medium
> +CFLAGS-fstat64.oS += -mcmodel=medium
> +CFLAGS-lstat64.oS += -mcmodel=medium
> +CFLAGS-fstatat.oS += -mcmodel=medium
> +CFLAGS-fstatat64.oS += -mcmodel=medium
> +CFLAGS-mknod.oS += -mcmodel=medium
> +CFLAGS-mknodat.oS += -mcmodel=medium
> +CFLAGS-pthread_atfork.oS += -mcmodel=medium
> +CFLAGS-warning-nop.oS += -mcmodel=medium
> +CFLAGS-stack_chk_fail_local.oS += -mcmodel=medium
> + 
> diff --git a/sysdeps/loongarch/at_quick_exit.c
> b/sysdeps/loongarch/at_quick_exit.c
> new file mode 100644
> index 0000000000..8d4b44a7eb
> --- /dev/null
> +++ b/sysdeps/loongarch/at_quick_exit.c
> @@ -0,0 +1 @@
> +#include <stdlib/at_quick_exit.c>
> diff --git a/sysdeps/loongarch/atexit.c b/sysdeps/loongarch/atexit.c
> new file mode 100644
> index 0000000000..fc055a4851
> --- /dev/null
> +++ b/sysdeps/loongarch/atexit.c
> @@ -0,0 +1 @@
> +#include <stdlib/atexit.c>
> diff --git a/sysdeps/loongarch/elf-init.c b/sysdeps/loongarch/elf-
> init.c
> new file mode 100644
> index 0000000000..5f261a9d16
> --- /dev/null
> +++ b/sysdeps/loongarch/elf-init.c
> @@ -0,0 +1 @@
> +#include <sysdeps/init_array/elf-init.c>
> diff --git a/sysdeps/loongarch/fstat.c b/sysdeps/loongarch/fstat.c
> new file mode 100644
> index 0000000000..c4504eebe7
> --- /dev/null
> +++ b/sysdeps/loongarch/fstat.c
> @@ -0,0 +1 @@
> +#include <io/fstat.c>
> diff --git a/sysdeps/loongarch/fstat64.c b/sysdeps/loongarch/fstat64.c
> new file mode 100644
> index 0000000000..143ca2b051
> --- /dev/null
> +++ b/sysdeps/loongarch/fstat64.c
> @@ -0,0 +1 @@
> +#include <io/fstat64.c>
> diff --git a/sysdeps/loongarch/fstatat.c b/sysdeps/loongarch/fstatat.c
> new file mode 100644
> index 0000000000..0b0a334241
> --- /dev/null
> +++ b/sysdeps/loongarch/fstatat.c
> @@ -0,0 +1 @@
> +#include <io/fstatat.c>
> diff --git a/sysdeps/loongarch/fstatat64.c
> b/sysdeps/loongarch/fstatat64.c
> new file mode 100644
> index 0000000000..e82b927477
> --- /dev/null
> +++ b/sysdeps/loongarch/fstatat64.c
> @@ -0,0 +1 @@
> +#include <io/fstatat64.c>
> diff --git a/sysdeps/loongarch/lstat.c b/sysdeps/loongarch/lstat.c
> new file mode 100644
> index 0000000000..f47a56aff8
> --- /dev/null
> +++ b/sysdeps/loongarch/lstat.c
> @@ -0,0 +1 @@
> +#include <io/lstat.c>
> diff --git a/sysdeps/loongarch/lstat64.c b/sysdeps/loongarch/lstat64.c
> new file mode 100644
> index 0000000000..d681165600
> --- /dev/null
> +++ b/sysdeps/loongarch/lstat64.c
> @@ -0,0 +1 @@
> +#include <io/lstat64.c>
> diff --git a/sysdeps/loongarch/mknod.c b/sysdeps/loongarch/mknod.c
> new file mode 100644
> index 0000000000..1ed3681ffe
> --- /dev/null
> +++ b/sysdeps/loongarch/mknod.c
> @@ -0,0 +1 @@
> +#include <io/mknod.c>
> diff --git a/sysdeps/loongarch/mknodat.c b/sysdeps/loongarch/mknodat.c
> new file mode 100644
> index 0000000000..82bc6ee637
> --- /dev/null
> +++ b/sysdeps/loongarch/mknodat.c
> @@ -0,0 +1 @@
> +#include <io/mknodat.c>
> diff --git a/sysdeps/loongarch/pthread_atfork.c
> b/sysdeps/loongarch/pthread_atfork.c
> new file mode 100644
> index 0000000000..0f01d80512
> --- /dev/null
> +++ b/sysdeps/loongarch/pthread_atfork.c
> @@ -0,0 +1 @@
> +#include <nptl/pthread_atfork.c>
> diff --git a/sysdeps/loongarch/stack_chk_fail_local.c
> b/sysdeps/loongarch/stack_chk_fail_local.c
> new file mode 100644
> index 0000000000..305871fbc0
> --- /dev/null
> +++ b/sysdeps/loongarch/stack_chk_fail_local.c
> @@ -0,0 +1 @@
> +#include <debug/stack_chk_fail_local.c>
> diff --git a/sysdeps/loongarch/stat.c b/sysdeps/loongarch/stat.c
> new file mode 100644
> index 0000000000..36461b870e
> --- /dev/null
> +++ b/sysdeps/loongarch/stat.c
> @@ -0,0 +1 @@
> +#include <io/stat.c>
> diff --git a/sysdeps/loongarch/stat64.c b/sysdeps/loongarch/stat64.c
> new file mode 100644
> index 0000000000..0897282e6a
> --- /dev/null
> +++ b/sysdeps/loongarch/stat64.c
> @@ -0,0 +1 @@
> +#include <io/stat64.c>
> diff --git a/sysdeps/loongarch/warning-nop.c
> b/sysdeps/loongarch/warning-nop.c
> new file mode 100644
> index 0000000000..b76aae79f9
> --- /dev/null
> +++ b/sysdeps/loongarch/warning-nop.c
> @@ -0,0 +1 @@
> +#include <debug/warning-nop.c>
  
Florian Weimer Nov. 23, 2022, 10:31 a.m. UTC | #2
> From: Chenghua Xu <xuchenghua@loongson.cn>
>
> This patch is used to fix address out-of-bounds error when building
> firefox.

The .c files shouldn't be necessary.  The CFLAGS additions should
perhaps be made subdirectory-specific.  And I think these days,
libc_nonshared.a is much, much small (and we could size it down even
further).

But shouldn't the medium model be the GCC default if it is required for
building applications?

Thanks,
Florian
  
Xi Ruoyao Nov. 23, 2022, 11:18 a.m. UTC | #3
On Wed, 2022-11-23 at 11:31 +0100, Florian Weimer wrote:
> > From: Chenghua Xu <xuchenghua@loongson.cn>
> > 
> > This patch is used to fix address out-of-bounds error when building
> > firefox.
> 
> The .c files shouldn't be necessary.  The CFLAGS additions should
> perhaps be made subdirectory-specific.  And I think these days,
> libc_nonshared.a is much, much small (and we could size it down even
> further).

In my build libc_nonshared.a only contains:

- at_quick_exit.oS
- atexit.oS
- pthread_atfork.oS
- stack_chk_fail_local.oS

> But shouldn't the medium model be the GCC default if it is required for
> building applications?

Small code model can support a 128MiB .text section, and most
applications have a .text section < 128MiB.  But Firefox libxul.so can
be extremely large.

It's not worthy to pay the cost everywhere just for satisfying a monster
application.
  
Florian Weimer Nov. 30, 2022, 7:40 a.m. UTC | #4
* Xi Ruoyao:

> On Wed, 2022-11-23 at 11:31 +0100, Florian Weimer wrote:
>> But shouldn't the medium model be the GCC default if it is required for
>> building applications?
>
> Small code model can support a 128MiB .text section, and most
> applications have a .text section < 128MiB.  But Firefox libxul.so can
> be extremely large.
>
> It's not worthy to pay the cost everywhere just for satisfying a
> monster application.

I see, I wasn't aware that the limit was that large.

Thanks,
Florian
  

Patch

diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile
index 746d4c2c8f..ccda57e2d4 100644
--- a/sysdeps/loongarch/Makefile
+++ b/sysdeps/loongarch/Makefile
@@ -5,3 +5,21 @@  endif
 # LoongArch's assembler also needs to know about PIC as it changes the
 # definition of some assembler macros.
 ASFLAGS-.os += $(pic-ccflag)
+
+CFLAGS-elf-init.oS += -mcmodel=medium
+CFLAGS-atexit.oS += -mcmodel=medium
+CFLAGS-at_quick_exit.oS += -mcmodel=medium
+CFLAGS-stat.oS += -mcmodel=medium
+CFLAGS-fstat.oS += -mcmodel=medium
+CFLAGS-lstat.oS += -mcmodel=medium
+CFLAGS-stat64.oS += -mcmodel=medium
+CFLAGS-fstat64.oS += -mcmodel=medium
+CFLAGS-lstat64.oS += -mcmodel=medium
+CFLAGS-fstatat.oS += -mcmodel=medium
+CFLAGS-fstatat64.oS += -mcmodel=medium
+CFLAGS-mknod.oS += -mcmodel=medium
+CFLAGS-mknodat.oS += -mcmodel=medium
+CFLAGS-pthread_atfork.oS += -mcmodel=medium
+CFLAGS-warning-nop.oS += -mcmodel=medium
+CFLAGS-stack_chk_fail_local.oS += -mcmodel=medium
+ 
diff --git a/sysdeps/loongarch/at_quick_exit.c b/sysdeps/loongarch/at_quick_exit.c
new file mode 100644
index 0000000000..8d4b44a7eb
--- /dev/null
+++ b/sysdeps/loongarch/at_quick_exit.c
@@ -0,0 +1 @@ 
+#include <stdlib/at_quick_exit.c>
diff --git a/sysdeps/loongarch/atexit.c b/sysdeps/loongarch/atexit.c
new file mode 100644
index 0000000000..fc055a4851
--- /dev/null
+++ b/sysdeps/loongarch/atexit.c
@@ -0,0 +1 @@ 
+#include <stdlib/atexit.c>
diff --git a/sysdeps/loongarch/elf-init.c b/sysdeps/loongarch/elf-init.c
new file mode 100644
index 0000000000..5f261a9d16
--- /dev/null
+++ b/sysdeps/loongarch/elf-init.c
@@ -0,0 +1 @@ 
+#include <sysdeps/init_array/elf-init.c>
diff --git a/sysdeps/loongarch/fstat.c b/sysdeps/loongarch/fstat.c
new file mode 100644
index 0000000000..c4504eebe7
--- /dev/null
+++ b/sysdeps/loongarch/fstat.c
@@ -0,0 +1 @@ 
+#include <io/fstat.c>
diff --git a/sysdeps/loongarch/fstat64.c b/sysdeps/loongarch/fstat64.c
new file mode 100644
index 0000000000..143ca2b051
--- /dev/null
+++ b/sysdeps/loongarch/fstat64.c
@@ -0,0 +1 @@ 
+#include <io/fstat64.c>
diff --git a/sysdeps/loongarch/fstatat.c b/sysdeps/loongarch/fstatat.c
new file mode 100644
index 0000000000..0b0a334241
--- /dev/null
+++ b/sysdeps/loongarch/fstatat.c
@@ -0,0 +1 @@ 
+#include <io/fstatat.c>
diff --git a/sysdeps/loongarch/fstatat64.c b/sysdeps/loongarch/fstatat64.c
new file mode 100644
index 0000000000..e82b927477
--- /dev/null
+++ b/sysdeps/loongarch/fstatat64.c
@@ -0,0 +1 @@ 
+#include <io/fstatat64.c>
diff --git a/sysdeps/loongarch/lstat.c b/sysdeps/loongarch/lstat.c
new file mode 100644
index 0000000000..f47a56aff8
--- /dev/null
+++ b/sysdeps/loongarch/lstat.c
@@ -0,0 +1 @@ 
+#include <io/lstat.c>
diff --git a/sysdeps/loongarch/lstat64.c b/sysdeps/loongarch/lstat64.c
new file mode 100644
index 0000000000..d681165600
--- /dev/null
+++ b/sysdeps/loongarch/lstat64.c
@@ -0,0 +1 @@ 
+#include <io/lstat64.c>
diff --git a/sysdeps/loongarch/mknod.c b/sysdeps/loongarch/mknod.c
new file mode 100644
index 0000000000..1ed3681ffe
--- /dev/null
+++ b/sysdeps/loongarch/mknod.c
@@ -0,0 +1 @@ 
+#include <io/mknod.c>
diff --git a/sysdeps/loongarch/mknodat.c b/sysdeps/loongarch/mknodat.c
new file mode 100644
index 0000000000..82bc6ee637
--- /dev/null
+++ b/sysdeps/loongarch/mknodat.c
@@ -0,0 +1 @@ 
+#include <io/mknodat.c>
diff --git a/sysdeps/loongarch/pthread_atfork.c b/sysdeps/loongarch/pthread_atfork.c
new file mode 100644
index 0000000000..0f01d80512
--- /dev/null
+++ b/sysdeps/loongarch/pthread_atfork.c
@@ -0,0 +1 @@ 
+#include <nptl/pthread_atfork.c>
diff --git a/sysdeps/loongarch/stack_chk_fail_local.c b/sysdeps/loongarch/stack_chk_fail_local.c
new file mode 100644
index 0000000000..305871fbc0
--- /dev/null
+++ b/sysdeps/loongarch/stack_chk_fail_local.c
@@ -0,0 +1 @@ 
+#include <debug/stack_chk_fail_local.c>
diff --git a/sysdeps/loongarch/stat.c b/sysdeps/loongarch/stat.c
new file mode 100644
index 0000000000..36461b870e
--- /dev/null
+++ b/sysdeps/loongarch/stat.c
@@ -0,0 +1 @@ 
+#include <io/stat.c>
diff --git a/sysdeps/loongarch/stat64.c b/sysdeps/loongarch/stat64.c
new file mode 100644
index 0000000000..0897282e6a
--- /dev/null
+++ b/sysdeps/loongarch/stat64.c
@@ -0,0 +1 @@ 
+#include <io/stat64.c>
diff --git a/sysdeps/loongarch/warning-nop.c b/sysdeps/loongarch/warning-nop.c
new file mode 100644
index 0000000000..b76aae79f9
--- /dev/null
+++ b/sysdeps/loongarch/warning-nop.c
@@ -0,0 +1 @@ 
+#include <debug/warning-nop.c>