I'm sorry, the v3 patch fixes this. I was incorrectly setting _DYNAMIC into
the GOT during static builds.

On Fri, Sep 2, 2022 at 11:55 AM Lance Fredrickson <[email protected]>
wrote:

> I applied this patch but while compiling uclibc-ng I get
>
> /opt/tomatoware/mipsel-soft-mmc/lib/gcc/mipsel-tomatoware-linux-uclibc/12.2.0/../../../../mipsel-tomatoware-linux-uclibc/bin/ld:
> ../lib/crt1.o: in function `__start':
> (.text+0x1c): undefined reference to `_DYNAMIC'
> collect2: error: ld returned 1 exit status
>
> I also applied Max's patch from that other thread along with this patch,
> but with both applied I still get "undefined reference to `_DYNAMIC'"
>
> On 9/1/2022 3:15 PM, linted wrote:
>
> Ok! After a ton of research and tracking down a bug in the mips64
> implementation, I was finally able to recreate and subsequently fix this
> bug. I'll submit the updated patch shortly!
>
> On Wed, Aug 24, 2022 at 5:10 PM Lance Fredrickson <[email protected]>
> wrote:
>
>> Hmm, wonder if small endian mips*el* has anything to do with it.
>>
>> I tried that patch on top of the other one and I get this error.
>>
>> mipsel-linux-g++ -static-pie hello.cpp -o hello
>> /opt/tomatoware/mipsel-soft-mmc/mipsel-tomatoware-linux-uclibc/sysroot/usr/lib/rcrt1.o:
>> in function `__start':
>> (.text+0x50): relocation truncated to fit: R_MIPS_PC16 against
>> `reloc_static_pie'
>> collect2: error: ld returned 1 exit status
>>
>> On 8/24/2022 1:23 PM, linted wrote:
>>
>> Hey Lance,
>> I'm having a bit of trouble recreating this bug. I do however have a
>> couple of possible solutions. Do you mind trying the following patch on top
>> of my previous one and letting me know if it solves the problem?
>>
>> ---
>>
>> diff --git a/libc/sysdeps/linux/mips/crt1.S
>> b/libc/sysdeps/linux/mips/crt1.S
>> index a7f72a90f..811b15387 100644
>> --- a/libc/sysdeps/linux/mips/crt1.S
>> +++ b/libc/sysdeps/linux/mips/crt1.S
>> @@ -81,6 +81,7 @@
>>  #ifdef L_rcrt1
>>         .type   reloc_static_pie,@function
>>         .weak   reloc_static_pie
>> +       .hidden .L0
>>  #endif
>>         .type       main,@function
>>         .type       __uClibc_main,@function
>> @@ -97,8 +98,8 @@ __start:
>>  #ifdef L_rcrt1
>>      PTR_LA $4, _DYNAMIC           /* Place _DYNAMIC into the GOT */
>>      REG_S $4, -0x7ff0($28)
>> -       jal L0                        /* Get the current $pc address */
>> -L0:
>> +       jal .L0                        /* Get the current $pc address */
>> +.L0:
>>         INT_SUB $25, $31, $25         /* Calculate load addr */
>>         move $4, $25                  /* store load addr in param 1 */
>>         and $29, -2 * SZREG           /* Ensure stack is aligned */
>>
>>
>> On Mon, Aug 22, 2022 at 1:37 PM Lance Fredrickson <
>> [email protected]> wrote:
>>
>>> Gave this patch a go with patched gcc for -static-pie for mips.
>>>
>>> It works when compiling hello.c, but when I tried c++ hello.cpp program
>>> I get the following build error.
>>>
>>> mipsel-linux-g++ -s -static-pie hello.cpp -o hello
>>> /opt/tomatoware/mipsel-soft-mmc/mipsel-tomatoware-linux-uclibc/sysroot/usr/lib/rcrt1.o:
>>>
>>> in function `L0':
>>> (.text+0x50): relocation truncated to fit: R_MIPS_PC16 against
>>> `reloc_static_pie'
>>> collect2: error: ld returned 1 exit status
>>>
>>> Also tested arm with the new reworked patch and it seems to work for c
>>> and c++ hello world.
>>>
>>> Lance
>>>
>>> On 8/20/2022 10:32 PM, linted wrote:
>>> > Hello,
>>> > I have completed a patch to get static pie support working for the
>>> > mips architecture.
>>> >
>>> > Unfortunately a lot of the optimizations I made for previous
>>> > architectures needed to be rewritten in order to support the way that
>>> > mips works. There is a substantial rewrite of reloc_static_pie,
>>> > however the code is nearly a copy paste from dl-startup.c and has been
>>> > tested with all the currently supported architectures to ensure that
>>> > it still works.
>>> >
>>> > In order to compile with gcc, a patch for mips static pie is required.
>>> > I'm actively working on submitting said patch, but I do not have a
>>> > link for it yet. In the meantime, compilation using the following
>>> > flags passed to gcc should suffice.
>>> >
>>> > mips-linux-gcc -static-pie -Bstatic -pie --no-dynamic-linker -z text
>>> > input.c -o output
>>> >
>>> > ----
>>> > From a6fa331c7ea16b5146c0d3ba3b2d6d723f09a9b4 Mon Sep 17 00:00:00 2001
>>> > From: linted <[email protected]>
>>> > Date: Sat, 20 Aug 2022 16:41:38 -0400
>>> > Subject: [PATCH] Added support for creation of Static
>>> Position-Independent
>>> >  Executables (PIE) on mips
>>> >
>>> > Updated config to allow compilation of rcrt1.o for mips and modified
>>> > it's crt1.S to perform relocates in __start.
>>> >
>>> > The mips architecture performs relocations differently then most other
>>> > architectures. reloc_static_pie was rewritten, taking code from
>>> > dl-startup.c, in order to perform the additional relocations.
>>> > Modifications were made to mips' dl-startup.h to allow for the use of
>>> > contained macros without including _start definition.
>>> >
>>> > Signed-off-by: linted <[email protected]>
>>> > ---
>>> >  extra/Configs/Config.in                |  2 +-
>>> >  ldso/ldso/mips/dl-startup.h            |  3 +-
>>> >  libc/misc/internals/Makefile.in        |  2 +-
>>> >  libc/misc/internals/reloc_static_pie.c | 91 ++++++++++++++++++++++----
>>> >  libc/sysdeps/linux/mips/crt1.S         | 22 +++++++
>>> >  5 files changed, 103 insertions(+), 17 deletions(-)
>>> >
>>> > diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in
>>> > index e0905e956..43c04fd0a 100644
>>> > --- a/extra/Configs/Config.in
>>> > +++ b/extra/Configs/Config.in
>>> > @@ -324,7 +324,7 @@ config DOPIC
>>> >  config STATIC_PIE
>>> >   bool "Add support for Static Position Independent Executables (PIE)"
>>> >   default n
>>> > - depends on DOPIC && !UCLIBC_FORMAT_FDPIC_ELF && (TARGET_arm ||
>>> > TARGET_i386 || TARGET_x86_64 || TARGET_aarch64)
>>> > + depends on DOPIC && !UCLIBC_FORMAT_FDPIC_ELF && (TARGET_arm ||
>>> > TARGET_i386 || TARGET_x86_64 || TARGET_aarch64 || TARGET_mips)
>>> >
>>> >  config ARCH_HAS_NO_SHARED
>>> >   bool
>>> > diff --git a/ldso/ldso/mips/dl-startup.h b/ldso/ldso/mips/dl-startup.h
>>> > index 8026f1702..c2168d774 100644
>>> > --- a/ldso/ldso/mips/dl-startup.h
>>> > +++ b/ldso/ldso/mips/dl-startup.h
>>> > @@ -7,6 +7,7 @@
>>> >
>>> >
>>> >  #include <sgidefs.h>
>>> > +#ifndef L_rcrt1
>>> >  __asm__(""
>>> >      " .text\n"
>>> >      " .globl _start\n"
>>> > @@ -114,6 +115,7 @@ __asm__(""
>>> >      "\n\n"
>>> >      ".previous\n"
>>> >  );
>>> > +#endif
>>> >
>>> >  /*
>>> >   * Get a pointer to the argv array.  On many platforms this can be
>>> just
>>> > @@ -191,6 +193,5 @@ do { \
>>> >   case R_MIPS_NONE: \
>>> >   break; \
>>> >   default: \
>>> > - SEND_STDERR("Aiieeee!"); \
>>> >   _dl_exit(1); \
>>> >   }
>>> > diff --git a/libc/misc/internals/Makefile.in
>>> > b/libc/misc/internals/Makefile.in
>>> > index 69af8b76e..908b18321 100644
>>> > --- a/libc/misc/internals/Makefile.in
>>> > +++ b/libc/misc/internals/Makefile.in
>>> > @@ -17,7 +17,7 @@ MISC_INTERNALS_SRC := $(patsubst
>>> > %.c,$(MISC_INTERNALS_DIR)/%.c,$(CSRC-y))
>>> >  MISC_INTERNALS_OBJ := $(patsubst
>>> %.c,$(MISC_INTERNALS_OUT)/%.o,$(CSRC-y))
>>> >
>>> >  CFLAGS-__uClibc_main.c := $(SSP_DISABLE_FLAGS)
>>> > -CFLAGS-reloc_static_pie.c := $(SSP_DISABLE_FLAGS)
>>> > +CFLAGS-reloc_static_pie.c := $(SSP_DISABLE_FLAGS) -DL_rcrt1
>>> >
>>> >  libc-y += $(MISC_INTERNALS_OBJ)
>>> >  ifneq ($(UCLIBC_FORMAT_SHARED_FLAT),y)
>>> > diff --git a/libc/misc/internals/reloc_static_pie.c
>>> > b/libc/misc/internals/reloc_static_pie.c
>>> > index 578202d23..cd9190d60 100644
>>> > --- a/libc/misc/internals/reloc_static_pie.c
>>> > +++ b/libc/misc/internals/reloc_static_pie.c
>>> > @@ -20,28 +20,91 @@
>>> >  #include <elf.h>
>>> >  #include <dl-elf.h>
>>> >
>>> > +#include <ldso.h>
>>> > +#ifdef __mips__
>>> > +#include <dl-startup.h>
>>> > +#endif
>>> > +
>>> >  ElfW(Addr) _dl_load_base = NULL;
>>> >
>>> >  void
>>> >  reloc_static_pie (ElfW(Addr) load_addr);
>>> >
>>> >  void
>>> > -reloc_static_pie (ElfW(Addr) load_addr)
>>> > +reloc_static_pie(ElfW(Addr) load_addr)
>>> >  {
>>> > -    ElfW(Word) relative_count = 0;
>>> > -    ElfW(Addr) rel_addr = 0;
>>> > -    ElfW(Dyn) * dyn_addr = NULL;
>>> > -    unsigned long dynamic_info[DYNAMIC_SIZE] = {0};
>>> > +    int indx;
>>> > +    ElfW(Addr) got;
>>> > +    ElfW(Dyn) *dpnt;
>>> > +    struct elf_resolve tpnt_tmp;
>>> > + struct elf_resolve *tpnt = &tpnt_tmp;
>>> > +
>>> > +    DL_BOOT_COMPUTE_GOT(got);
>>> > +    DL_BOOT_COMPUTE_DYN(dpnt, got, (DL_LOADADDR_TYPE)load_addr);
>>> > +
>>> > +    _dl_memset(tpnt, 0, sizeof(struct elf_resolve));
>>> > +    tpnt->loadaddr = load_addr;
>>> > +    tpnt->dynamic_addr = dpnt;
>>> > +
>>> > +    __dl_parse_dynamic_info(dpnt, tpnt->dynamic_info, NULL,
>>> load_addr);
>>> > +
>>> > +#if defined(PERFORM_BOOTSTRAP_GOT)
>>> > + /* some arches (like MIPS) we have to tweak the GOT before
>>> > relocations */
>>> > + PERFORM_BOOTSTRAP_GOT(tpnt);
>>> > +#endif
>>> > +
>>> > +
>>> > +#if defined(ELF_MACHINE_PLTREL_OVERLAP)
>>> > +# define INDX_MAX 1
>>> > +#else
>>> > +# define INDX_MAX 2
>>> > +#endif
>>> > +
>>> > +    for (indx = 0; indx < INDX_MAX; indx++) {
>>> > +        unsigned long rel_addr, rel_size;
>>> > +        ElfW(Word) relative_count =
>>> tpnt->dynamic_info[DT_RELCONT_IDX];
>>> > +
>>> > +        rel_addr = (indx ? tpnt->dynamic_info[DT_JMPREL] :
>>> > + tpnt->dynamic_info[DT_RELOC_TABLE_ADDR]);
>>> > +        rel_size = (indx ? tpnt->dynamic_info[DT_PLTRELSZ] :
>>> > +               tpnt->dynamic_info[DT_RELOC_TABLE_SIZE]);
>>> > +
>>> > +        if (!rel_addr)
>>> > +            continue;
>>> >
>>> > -    /* Read our own dynamic section and fill in the info array.  */
>>> > -    dyn_addr = ((void *) load_addr + elf_machine_dynamic ());
>>> > +        if((0 == indx) && relative_count) {
>>> > + rel_size -= relative_count * sizeof(ELF_RELOC);
>>> > +            elf_machine_relative(load_addr, rel_addr, relative_count);
>>> > + rel_addr += relative_count * sizeof(ELF_RELOC);
>>> > +        }
>>> >
>>> > -    /* Use the underlying function to avoid TLS access before
>>> > initialization */
>>> > -    __dl_parse_dynamic_info(dyn_addr, dynamic_info, NULL, load_addr);
>>> > +#ifdef ARCH_NEEDS_BOOTSTRAP_RELOCS
>>> > + {
>>> > + ELF_RELOC *rpnt;
>>> > + unsigned int i;
>>> > + ElfW(Sym) *sym;
>>> > + unsigned long symbol_addr;
>>> > + int symtab_index;
>>> > + unsigned long *reloc_addr;
>>> >
>>> > -    /* Perform relocations */
>>> > -    relative_count = dynamic_info[DT_RELCONT_IDX];
>>> > -    rel_addr = dynamic_info[DT_RELOC_TABLE_ADDR];
>>> > -    elf_machine_relative(load_addr, rel_addr, relative_count);
>>> > + /* Now parse the relocation information */
>>> > + rpnt = (ELF_RELOC *) rel_addr;
>>> > + for (i = 0; i < rel_size; i += sizeof(ELF_RELOC), rpnt++) {
>>> > + reloc_addr = (unsigned long *) DL_RELOC_ADDR(load_addr, (unsigned
>>> > long)rpnt->r_offset);
>>> > + symtab_index = ELF_R_SYM(rpnt->r_info);
>>> > + symbol_addr = 0;
>>> > + sym = NULL;
>>> > + if (symtab_index) {
>>> > + ElfW(Sym) *symtab;
>>> > + symtab = (ElfW(Sym) *) tpnt->dynamic_info[DT_SYMTAB];
>>> > + sym = &symtab[symtab_index];
>>> > + symbol_addr = (unsigned long) DL_RELOC_ADDR(load_addr,
>>> sym->st_value);
>>> > + }
>>> > + /* Use this machine-specific macro to perform the actual relocation.
>>>  */
>>> > + PERFORM_BOOTSTRAP_RELOC(rpnt, reloc_addr, symbol_addr, load_addr,
>>> sym);
>>> > + }
>>> > + }
>>> > +#endif
>>> > +    }
>>> >      _dl_load_base = load_addr;
>>> > -}
>>> > +}
>>> > \ No newline at end of file
>>> > diff --git a/libc/sysdeps/linux/mips/crt1.S
>>> > b/libc/sysdeps/linux/mips/crt1.S
>>> > index 083615515..a7f72a90f 100644
>>> > --- a/libc/sysdeps/linux/mips/crt1.S
>>> > +++ b/libc/sysdeps/linux/mips/crt1.S
>>> > @@ -77,6 +77,10 @@
>>> >  #ifndef __UCLIBC_CTOR_DTOR__
>>> >   .weak _init
>>> >   .weak _fini
>>> > +#endif
>>> > +#ifdef L_rcrt1
>>> > + .type reloc_static_pie,@function
>>> > + .weak reloc_static_pie
>>> >  #endif
>>> >   .type    main,@function
>>> >   .type    __uClibc_main,@function
>>> > @@ -90,6 +94,24 @@ __start:
>>> >   PTR_LA $28, _gp             /* Setup GP correctly if we're non-PIC.
>>>  */
>>> >   move $31, $0
>>> >  #endif
>>> > +#ifdef L_rcrt1
>>> > +    PTR_LA $4, _DYNAMIC           /* Place _DYNAMIC into the GOT */
>>> > +    REG_S $4, -0x7ff0($28)
>>> > + jal L0                        /* Get the current $pc address */
>>> > +L0:
>>> > + INT_SUB $25, $31, $25         /* Calculate load addr */
>>> > + move $4, $25                  /* store load addr in param 1 */
>>> > + and $29, -2 * SZREG           /* Ensure stack is aligned */
>>> > + addi $29, $29, (-2 * SZREG)   /* Allocate 2 register spaces on stack
>>> */
>>> > + REG_S $2, SZREG($29)          /* Store atexit in case it exists */
>>> > + PTR_LA $5, reloc_static_pie   /* function calls before relocation
>>> > +                                 don't work unless we set $t9
>>> manually */
>>> > + INT_ADDU $25, $25, $5         /* store reloc_static_pie in $t9 */
>>> > + bal reloc_static_pie          /* call, and pray the compiler adds a
>>> nop
>>> > +                                 in delay slot */
>>> > + REG_L $2, SZREG($29)          /* cleanup stack */
>>> > + addi $29, $29, (2 * SZREG)
>>> > +#endif
>>> >
>>> >   PTR_LA $4, main /* main */
>>> >   PTR_L $5, 0($29) /* argc */
>>> > --
>>> > 2.34.1
>>> >
>>> >
>>> > _______________________________________________
>>> > devel mailing list -- [email protected]
>>> > To unsubscribe send an email to [email protected]
>>>
>>> _______________________________________________
>>> devel mailing list -- [email protected]
>>> To unsubscribe send an email to [email protected]
>>>
>>
>>
>
_______________________________________________
devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to