We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi all,
I am trying to understand how shared libraries and PLT works. As per my current understanding linking a shared library should output code that calls a function (function from the shared library) by going through the PLT. And the function itself should not be present in the linked output.
For example.
fun.c (Compiled into a shared library)
unsigned int fun ( unsigned int x ) { return(x+3); }
so.c (main executable)
extern unsigned int fun ( unsigned int x ); unsigned int x; unsigned int y; unsigned int z; void centry ( void ) { x=7; y=8; z=fun(77); while(1){ } }
I am compiling using the following steps.
rm -rf boot.o so.o fun.o so.elf so.srec so.list so.bin arm-none-eabi-as -g -mcpu=cortex-m4 -mthumb --warn boot.s -o boot.o arm-none-eabi-gcc -g -Wall -O0 -fpic -mcpu=cortex-m4 -mthumb -c so.c -o so.o arm-none-eabi-gcc -g -shared -Wall -O0 -fpic -mcpu=cortex-m4 -mthumb -c fun.c -o libfun.so arm-none-eabi-ld -g -o so.elf -T flash.ld boot.o so.o -shared -L. -lfun arm-none-eabi-objdump -D so.elf > so.list arm-none-eabi-objcopy --srec-forceS3 so.elf -O srec so.srec arm-none-eabi-objcopy so.elf so.bin -O binary
Complete code is at: https://github.com/rgujju/STM32-projects/tree/master/got_plt
question 1) The output of the above code should not have the function <fun> right? But the output elf file <so.elf> has the function <fun> in it. The call to <fun> and <centry> both go through the plt which I think is correct and the dynamic linker will patch these entries. But why does it contain the function <fun>?
question 2) In the disassembly of the PLT there are instructions which contain a register <ip>. As per my understanding there isnt any register called <ip> in cortex M4. see line 9 and 10 below.
Disassembly of section .plt: 08000084 <.plt>: 8000084: b500 push {lr} 8000086: f8df e008 ldr.w lr, [pc, #8] ; 8000090 <.plt+0xc> 800008a: 44fe add lr, pc 800008c: f85e ff08 ldr.w pc, [lr, #8]! 8000090: 00000220 andeq r0, r0, r0, lsr #4 8000094: f240 2c1c movw ip, #540 ; 0x21c 8000098: f2c0 0c00 movt ip, #0 800009c: 44fc add ip, pc 800009e: f8dc f000 ldr.w pc, [ip] 80000a2: bf00 nop 80000a4: f240 2c10 movw ip, #528 ; 0x210 80000a8: f2c0 0c00 movt ip, #0 80000ac: 44fc add ip, pc 80000ae: f8dc f000 ldr.w pc, [ip] 80000b2: bf00 nop
Thank you for your help.