plt for arm gnu thumb

johnmc@sidsa.es johnmc@sidsa.es
Thu Apr 20 14:32:00 GMT 2006


> On Wed, Apr 19, 2006 at 05:00:15PM +0200, johnmc@sidsa.es wrote:
>> Hi Daniel
>
> Please, if you have further questions, send them to the list and not to
> me personally.  That's more useful for everyone.
>
> Also, if you want help, I recommend more precise reports: command lines
> used, test cases, objdump output for what appears to be wrong.
>
> --
> Daniel Jacobowitz
> CodeSourcery
>

hello

A couple of days ago I found out that the "procedure linkage table" - plt
produced  when transitioning
on an ARM V4t chip does not function.
So the suggestion was that I design my code so that the transition from
the plt is to an ARM compiled
function that then can call a THUMB compiled function.

I have been trying to do this and it does not seem to work either - or
maybe I am not doing it properly as
I have no previous experience using interworking.

In order to test this I have built a small test shared library .
Here are the commands I used to build this SHARED LIBRARY.

The 2 modules used are
dyn_load_module.c  - THUMB
dynamic_arm.c      - ARM


compile:
arm-elf-gcc -c -fpic  -mthumb -mthumb-interwork dyn_load_module.c  -o
dyn_load_module.o
arm-elf-gcc -c -fpic          -mthumb-interwork dynamic_arm.c      -o
dynamic_arm.o

shared link:
arm-elf-ld  -shared dyn_load_module.o   dynamic_arm.o   -o prog.out
=================================
here is the code:
dynamic_arm.c
void func_shared_arm(void)
{


   func_shared();


}


dyn_load_module.c
extern void func_shared(void);
static void func_shared_static(void);

int global_var = 0x3333;
int global_var1 = 0xaaaa;
int global_var2 = 0xbbbb;
int global_var3 = 0xeeee;
int global_var4 = 0xffff;
int global_var5 = 0xaaaa;
int global_var6 = 0xaaaa;
int global_var7 = 0xaaaa;
int global_var8 = 0xaaaa;
int global_var9 = 0xaaaa;

static int static_global_var = 0x4444;
static int static_global_var2 = 0x1111;

void func_shared(void)
{

   global_var = 0xff;
   static_global_var = 200;
   func_shared_static();


   int x =1;
}


static void func_shared_static(void)
{
   int x =1;
}
======================================





very simple stuff - ARM function func_shared_arm() - calls - THUMB funtion
func_shared()
but the assembler produced below just looks like RUBBISH!!

ANYONE GOT ANY IDEA WHAT I AM DOING WRONG -



dyn_load_module.s:     file format elf32-littlearm

SYMBOL TABLE:
00000094 l    d  .hash	00000000 .hash
00000150 l    d  .dynsym	00000000 .dynsym
00000310 l    d  .dynstr	00000000 .dynstr
00000410 l    d  .rel.dyn	00000000 .rel.dyn
00000420 l    d  .rel.plt	00000000 .rel.plt
00000428 l    d  .plt	00000000 .plt
00000448 l    d  .text	00000000 .text
000005c8 l    d  .dynamic	00000000 .dynamic
00000658 l    d  .got	00000000 .got
00000670 l    d  .data	00000000 .data
000006a0 l    d  .bss	00000000 .bss
00000000 l    d  .comment	00000000 .comment
00080000 l    d  .stack	00000000 .stack
00000000 l    d  *ABS*	00000000 .shstrtab
00000000 l    d  *ABS*	00000000 .symtab
00000000 l    d  *ABS*	00000000 .strtab
00000000 l    df *ABS*	00000000 dyn_load_module.c
00000698 l     O .data	00000004 static_global_var
0000069c l     O .data	00000004 static_global_var2
00000490 l     F .text	0000001c func_shared_static
00000000 l    df *ABS*	00000000 dynamic_arm.c
00000658 l     O *ABS*	00000000 .hidden _GLOBAL_OFFSET_TABLE_
00000670 g     O .data	00000004 global_var
000004c8 g       *ABS*	00000000 __exidx_end
000005c8 g     O *ABS*	00000000 _DYNAMIC
000006a0 g       *ABS*	00000000 _bss_end__
00000684 g     O .data	00000004 global_var5
000006a0 g       *ABS*	00000000 __bss_start__
000004c8 g       *ABS*	00000000 __exidx_start
0000068c g     O .data	00000004 global_var7
000006a0 g       *ABS*	00000000 __bss_end__
00000448 g     F .text	00000048 func_shared
00000694 g     O .data	00000004 global_var9
00000690 g     O .data	00000004 global_var8
000006a0 g       *ABS*	00000000 __bss_start
00000680 g     O .data	00000004 global_var4
000004ac g     F .text	0000001c func_shared_arm
000006a0 g       *ABS*	00000000 __end__
00000674 g     O .data	00000004 global_var1
00000678 g     O .data	00000004 global_var2
000006a0 g       *ABS*	00000000 _edata
000006a0 g       *ABS*	00000000 _end
00080000 g       .stack	00000000 _stack
00000670 g       .data	00000000 __data_start
00000688 g     O .data	00000004 global_var6
0000067c g     O .data	00000004 global_var3


Disassembly of section .plt:

00000428 <.plt>:
 428:	e52de004 	str	lr, [sp, #-4]!
 42c:	e59fe004 	ldr	lr, [pc, #4]	; 438 <func_shared-0x10>
 430:	e08fe00e 	add	lr, pc, lr
 434:	e5bef008 	ldr	pc, [lr, #8]!
 438:	00000220 	andeq	r0, r0, r0, lsr #4
 43c:	e28fc600 	add	ip, pc, #0	; 0x0
 440:	e28cca00 	add	ip, ip, #0	; 0x0
 444:	e5bcf220 	ldr	pc, [ip, #544]!
Disassembly of section .text:

00000448 <func_shared>:
 448:	b580      	push	{r7, lr}
 44a:	4657      	mov	r7, sl
 44c:	b480      	push	{r7}
 44e:	4f0d      	ldr	r7, [pc, #52]	(484 <.text+0x3c>)
 450:	46ba      	mov	sl, r7
 452:	44fa      	add	sl, pc
 454:	466f      	mov	r7, sp
 456:	b081      	sub	sp, #4
 458:	4b0b      	ldr	r3, [pc, #44]	(488 <.text+0x40>)
 45a:	4453      	add	r3, sl
 45c:	681a      	ldr	r2, [r3, #0]
 45e:	23ff      	mov	r3, #255
 460:	6013      	str	r3, [r2, #0]
 462:	4b0a      	ldr	r3, [pc, #40]	(48c <.text+0x44>)
 464:	4453      	add	r3, sl
 466:	681a      	ldr	r2, [r3, #0]
 468:	23c8      	mov	r3, #200
 46a:	6013      	str	r3, [r2, #0]
 46c:	f810f000 	bl	490 <func_shared_static>
 470:	1f3a      	sub	r2, r7, #4
 472:	2301      	mov	r3, #1
 474:	6013      	str	r3, [r2, #0]
 476:	46bd      	mov	sp, r7
 478:	bc04      	pop	{r2}
 47a:	4692      	mov	sl, r2
 47c:	bc80      	pop	{r7}
 47e:	bc01      	pop	{r0}
 480:	4700      	bx	r0
 482:	0000      	lsl	r0, r0, #0
 484:	0202      	lsl	r2, r0, #8
 486:	0000      	lsl	r0, r0, #0
 488:	0014      	lsl	r4, r2, #0
 48a:	0000      	lsl	r0, r0, #0
 48c:	0010      	lsl	r0, r2, #0
	...

00000490 <func_shared_static>:
 490:	b580      	push	{r7, lr}
 492:	4657      	mov	r7, sl
 494:	b480      	push	{r7}
 496:	466f      	mov	r7, sp
 498:	b081      	sub	sp, #4
 49a:	1f3a      	sub	r2, r7, #4
 49c:	2301      	mov	r3, #1
 49e:	6013      	str	r3, [r2, #0]
 4a0:	46bd      	mov	sp, r7
 4a2:	bc04      	pop	{r2}
 4a4:	4692      	mov	sl, r2
 4a6:	bc80      	pop	{r7}
 4a8:	bc01      	pop	{r0}
 4aa:	4700      	bx	r0

000004ac <func_shared_arm>:
 4ac:	e1a0c00d 	mov	ip, sp
 4b0:	e92dd800 	stmdb	sp!, {fp, ip, lr, pc}
 4b4:	e24cb004 	sub	fp, ip, #4	; 0x4
 4b8:	ebffffdf 	bl	43c <func_shared-0xc>
 4bc:	e24bd00c 	sub	sp, fp, #12	; 0xc
 4c0:	e89d6800 	ldmia	sp, {fp, sp, lr}
 4c4:	e12fff1e 	bx	lr




More information about the Binutils mailing list