Message ID | 20221123070905.1618136-1-caiyinyu@loongson.cn |
---|---|
State | New |
Headers | show |
Series | LoongArch: Use medium cmodel build libc_nonshared.a. | expand |
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>
> 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
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.
* 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
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>
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