Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I think I have repeated what you are seeing:</p> <pre> statloc.c unsigned int glob; unsigned int fun ( unsigned int a ) { static unsigned int loc; if(a==0) loc=7; return(a+glob+loc); } </pre> <pre> arm-none-linux-gnueabi-gcc -mcpu=cortex-m3 -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -mthumb -fpic -pie -S statloc.c </pre> <p>Which gives:</p> <pre><code> .cpu cortex-m3 .fpu softvfp .thumb .text .align 2 .global fun .thumb .thumb_func fun: ldr r3, .L6 .LPIC2: add r3, pc cbnz r0, .L5 ldr r1, .L6+4 movs r2, #7 .LPIC1: add r1, pc ldr ip, .L6+8 str r2, [r1, #0] ldr r1, [r3, ip] ldr r3, [r1, #0] adds r0, r0, r3 adds r0, r0, r2 bx lr .L5: ldr ip, .L6+8 ldr r2, .L6+12 ldr r1, [r3, ip] .LPIC0: add r2, pc ldr r2, [r2] ldr r3, [r1, #0] adds r0, r0, r3 adds r0, r0, r2 bx lr .L7: .align 2 .L6: .word _GLOBAL_OFFSET_TABLE_-(.LPIC2+4) .word .LANCHOR0-(.LPIC1+4) .word glob(GOT) .word .LANCHOR0-(.LPIC0+4) .size fun, .-fun .comm glob,4,4 .bss .align 2 .LANCHOR0 = . + 0 .type loc.823, %object .size loc.823, 4 loc.823: .space 4 </code></pre> <p>I also added startup code and compiled a binary and disassembled to further understand/verify what is going on. </p> <pre> this is the offset from the pc to the .got ldr r3, .L6 add pc so r3 holds a position independent offset to the .got add r3, pc offset in the got for the address of the glob ldr ip, .L6+8 read the absolute address for the global variable from the got ldr r1, [r3, ip] finally read the global variable into r3 ldr r3, [r1, #0] this is the offset from the pc to the static local in .bss ldr r2, .L6+12 add pc so that r2 holds a position independent offset to the static local in .bss add r2, pc read the static local in .bss ldr r2, [r2] </pre> <p>So if you were to change where .text is loaded and were to change where both .got and .bss are loaded relative to .text and that is it then the contents of .got would be wrong and the global variable would be loaded from the wrong place.</p> <p>if you were to change where .text is loaded, leave .bss where the linker put it and move .got relative to .text. then the global would be pulled from the right place and the local would not</p> <p>if you were to change where .text is loaded, change where both .got and .bss are loaded relative to .text and modify .got contents to reflect where .text is loaded, then both the local and global variable would be accessed from the right place.</p> <p>So the loader and gcc/ld need to all be in sync. My immediate recommendation is to not use a static local and just use a global. That or dont worry about position independent code, it is a cortex-m3 after all and somewhat resource limited, just define the memory map up front. I assume the question is how do I make gcc use the .got for the local global, and that one I dont know the answer to, but taking a simple example like the one above you can work through the many command line options until you find one that changes the output.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload