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

Position independent m68k code



Joel Sherrill wrote, On 5/14/2004 9:13 AM:

> geneSmith wrote:
> 
>> This does not apply directly to rtems but I am using the m68k-rtems-* 
>> toolchain but for running under an non-rtems system.
>>
>> The non-rtems embedded system allows you to create a C program which 
>> it can run. It requires that the C program be written in PC relative 
>> (i.e., position independent) m68k code. m68k-rtems-gcc supports this, 
>> as best I can tell, using the -fpic option.
>>
>> When I use the -fpic option and link with m68k-rtems-ld I get section 
>> .got and .got.plt.  Does anyone on the rtems list know anything about 
>> how I should use or possibly initialize these? (Most of what I can 
>> find on Global Offset Table and Procedure Linkage Table applies to 
>> runtime dynamic linking which the non-rtems system definitely does not 
>> do.)
> 
> 
> I always come away from a discussion of sections a bit fuzzy headed.
> The definitive answer is always going to come from binutils.
> 
> This post may clarify it some.
> 
> http://sources.redhat.com/ml/binutils/2004-03/msg00350.html
> 
> In general, I follow the pattern in the generic linker scripts
> in $prefix/lib/ldscripts when dealing with sections.
> 
>> Thanks,
>> -gene

Thanks Joel. I actually found something on the crossgcc list from 1999. 
I ended up ignoring the .got.plt and just locating and correcting the 
.got section. This show what I found (but with one small bug correction):

This describes almost exactly what I was looking for.
http://sources.redhat.com/ml/crossgcc/1999-q1/msg00170.html
Thanks you Olivier Carmona!

A minor bug in O. Carmona's code. When used, a2 is
a positive offset. With original code it was negative. Made it positive
with 3 lines labeled new*: below.

start:

....

         /* Load the address relative to the PC */
         lea     (_GLOBAL_OFFSET_TABLE_,pc),a5
         /* Load the address given by the linker */
         movea.l #_GLOBAL_OFFSET_TABLE_,a2
         /* Then find the offset */
         suba.l  a5,a2
         beq     L1                  /* Null Offset ? */
new1:   move.l  a2,d1
new2:   neg.l   d1
new3:   move.l  d1,a2

         /* Add the offset to all of the Global Offset Table */
         move.l  #gotsize,d1         /* gostize : linker variable */
L0:     subq.l  #4,d1
         blt.b   L1                  /* End of GOT ? */
         movea.l (a5,d1.l),a3        /* Read the GOT */
         adda.l  a2,a3               /* Add the offset */
         move.l  a3,(a5,d1.l)        /* Write back in the GOT */
         bra     L0