Re: STM32, Position independent code - function pointers not in GOT?

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

 



I just created example project. Download here: http://www.vranet.cz/sedlons/
stm32f4-example.tar.gz

In test.objdump is problem visible e.g. at 0x800c56a.

(At the begin,  in the register R10 is offset. This value is used for
computing GOT and VTOR. After then R10 point to GOT. )

2017-10-17 13:59 GMT+02:00 Robert Sedláček <sedlons451@xxxxxxxxx>:

> I need a position independent code (PIC) working on STM32F401. But i have
> problem with pointers to functions used e.g. in struct.
>
> Short example:
>
>     struct process {
>       struct process *next;
>       const char *name;
>       PT_THREAD((* thread)(struct pt *, process_event_t, process_data_t));
>       struct pt pt;
>       unsigned char state, needspoll;
>     };
>
>     process etimer_process...
>
>     static void call_process(struct process *p, process_event_t ev,
> process_data_t data) {
>       int ret;
>       ret = p->thread(&p->pt, ev, data);
>     }
>
>
> After diassembly:
>
>     Disassembly of section .data:
>        ...
>      20000768 <etimer_process>:
>      20000768: 00000000 andeq r0, r0, r0
>      2000076c: 0803b134 stmdaeq r3, {r2, r4, r5, r8, ip, sp, pc}
>      20000770: 08027435 stmdaeq r2, {r0, r2, r4, r5, sl, ip, sp, lr}
>      20000774: 00000000 andeq r0, r0, r0
>        ...
>
>     Disassembly of section .text:
>        ...
>      8027da4: 68fb      ldr r3, [r7, #12]  //R3 = 0x20000768
>      8027da6: 689b      ldr r3, [r3, #8]   //R3 = 0x8027435
>        ...
>      8027db2: 4798      blx r3  //Branch to R3
>        ...
>
> Branch address in R3 is wrong for code at offset different than 0. I don't
> see use of GOT here. It is a bug or missing compiler/linker option?
>
> ----
>
> Things which i have probably successfully solved:
>
>  - GOT fixup
>  - Interrupt table fixup
>  - Newlib compiled with appropriate cflags
>
> Used CFLAGS:
>
> > -mlittle-endian -mthumb -mthumb-interwork -mcpu=cortex-m4
> -fsingle-precision-constant -Wdouble-promotion -msoft-float -fpic
> -msingle-pic-base -mpic-data-is-text-relative -mpic-register=r10
> -Wno-strict-aliasing -lc
>
> and linking with
>
> > -fpic
>




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux