This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]