Skip to contentSkip to conversation

Unhandled relocation of type 11

DISCUSSION Joshua Lamorie 2 participants 4 messages Apr 6, 2005 – Apr 8, 2005

lore
Share & tools
lore
#0 lore raw

Please excuse this cross-post, but I think it is of interest to both RTAI and Linux PPC folks.

I am making a kernel module (an RTAI task) that needs floating point support so I'm using IBMs perflib floating-point libraries (on a Virtex-II Pro, aka ppc405).

This is actually built from Matlab/simulink real-time workshop output (I can't use rtai-lab because I don't think lxrt is available for ppc)... so there end up being many object files to link.

So, in the end I have a linker command as follows.

powerpc-405-linux-gnu-ld -r -m elf32ppclinux -L/some/directories matlab_root/rtw/c/libsrc/rt_zcfcn.o other.o inputs.o -o module_output.o perflibs/fpopt/libppcfp.a

Then I go to insert the module and....
/var/shm # insmod test001_build_rtmodule.o
Warning: loading test001_build_rtmodule.o will taint the kernel: non-GPL license - Proprietary
See http://www.tux.org/lkml/#export-tainted for information about
tainted modules
test001_build_rtmodule.o: Unhandled relocation of type 11 for __fixdfsi test001_build_rtmodule.o: Unhandled relocation of type 11 for __fixdfsi

Hrmm... so any ideas on what type 11 is? I can see from the code in modutils that this value is inside rel->r_info, such as R_PPC_ADDR32 or R_PPC_ADDR16_HA.

But where do I get more info about where r_info gets assigned? Do I need to link libppcfp.a in a particular way?

Any hints would be appreciated.

Thanks in advance.

Joshua

Signature · 11 lines
Xiphos Technologies
(514) 848-9640 x227
(514) 848-9644 fax

www.xiplink.com
_______________________________________________
The information transmitted is intended only for the
person or entity to which it is addressed and may contain
confidential and/or privileged material.  If you have
received this in error, please contact the sender and delete
this communication and any copy immediately. Thank you.
#1 lore raw

Hello,

I'm not a linker expert but some time ago I got the gcc soft floating library working for 8xx and 4xx in kernel space. The problem was with PIC. Maybe your library is built with PIC and it's required without. You may want to have a look to:

ftp://ftp.denx.de/pub/RTAI/contrib/fp_ppc_8xx.tar.bz2

Wolfgang.

Quoted 39 lines · Joshua Lamorie

Please excuse this cross-post, but I think it is of interest to both RTAI and Linux PPC folks.

I am making a kernel module (an RTAI task) that needs floating point support so I'm using IBMs perflib floating-point libraries (on a Virtex-II Pro, aka ppc405).

This is actually built from Matlab/simulink real-time workshop output (I can't use rtai-lab because I don't think lxrt is available for ppc)... so there end up being many object files to link.

So, in the end I have a linker command as follows.

powerpc-405-linux-gnu-ld -r -m elf32ppclinux -L/some/directories matlab_root/rtw/c/libsrc/rt_zcfcn.o other.o inputs.o -o module_output.o perflibs/fpopt/libppcfp.a

Then I go to insert the module and....
/var/shm # insmod test001_build_rtmodule.o
Warning: loading test001_build_rtmodule.o will taint the kernel: non-GPL license - Proprietary
See http://www.tux.org/lkml/#export-tainted for information about
tainted modules
test001_build_rtmodule.o: Unhandled relocation of type 11 for __fixdfsi test001_build_rtmodule.o: Unhandled relocation of type 11 for __fixdfsi

Hrmm... so any ideas on what type 11 is? I can see from the code in modutils that this value is inside rel->r_info, such as R_PPC_ADDR32 or R_PPC_ADDR16_HA.

But where do I get more info about where r_info gets assigned? Do I need to link libppcfp.a in a particular way?

Any hints would be appreciated.

Thanks in advance.

Joshua

#2 lore raw

Gidday there,

Thanks for the hint. However I can't see any reference to -fPIC in the makefiles for ppcperflib. One thing I have discovered though is that type 11 is defined in /usr/include/elf.h as R_PPC_ELF14. This error happens twice, for __fixdfsi, and when I look for references to __fixdfsi, I find that there are two calls to...

blt __fixdfsi

inside ppc_dtoui.S. Looking at the PPC Ref Guide, I see that blt is a mnemonic for bc (branch conditional) and uses a relative offset of 14 bits. In the same function there is also a use of 'bl' (branch, long I think) calling the same __fixdfsi. So I'm going to add a stupid line of assembly to conditionally jump over the branch to __fixdfsi... I hope that will work, but I haven't touched assembly since an 80286.

Joshua

Quoted 47 lines · Wolfgang Grandegger

Hello,

I'm not a linker expert but some time ago I got the gcc soft floating library working for 8xx and 4xx in kernel space. The problem was with PIC. Maybe your library is built with PIC and it's required without. You may want to have a look to:

ftp://ftp.denx.de/pub/RTAI/contrib/fp_ppc_8xx.tar.bz2

Wolfgang.

Quoted 32 lines · Joshua Lamorie

Please excuse this cross-post, but I think it is of interest to both RTAI and Linux PPC folks.

I am making a kernel module (an RTAI task) that needs floating point support so I'm using IBMs perflib floating-point libraries (on a Virtex-II Pro, aka ppc405).

This is actually built from Matlab/simulink real-time workshop output (I can't use rtai-lab because I don't think lxrt is available for ppc)... so there end up being many object files to link.

So, in the end I have a linker command as follows.

powerpc-405-linux-gnu-ld -r -m elf32ppclinux -L/some/directories matlab_root/rtw/c/libsrc/rt_zcfcn.o other.o inputs.o -o module_output.o perflibs/fpopt/libppcfp.a

Then I go to insert the module and....
/var/shm # insmod test001_build_rtmodule.o
Warning: loading test001_build_rtmodule.o will taint the kernel: non-GPL license - Proprietary
See http://www.tux.org/lkml/#export-tainted for information about
tainted modules
test001_build_rtmodule.o: Unhandled relocation of type 11 for __fixdfsi test001_build_rtmodule.o: Unhandled relocation of type 11 for __fixdfsi

Hrmm... so any ideas on what type 11 is? I can see from the code in modutils that this value is inside rel->r_info, such as R_PPC_ADDR32 or R_PPC_ADDR16_HA.

But where do I get more info about where r_info gets assigned? Do I need to link libppcfp.a in a particular way?

Any hints would be appreciated.

Thanks in advance.

Joshua

Signature · 11 lines
Xiphos Technologies
(514) 848-9640 x227
(514) 848-9644 fax

www.xiplink.com
_______________________________________________
The information transmitted is intended only for the
person or entity to which it is addressed and may contain
confidential and/or privileged material.  If you have
received this in error, please contact the sender and delete
this communication and any copy immediately. Thank you.
#3 lore raw

Yes, this fix appeared to work. It looks like there are just four 14-bit references:

ppc_ftoui.S:56:     blt     __fixsfsi               /* return directly from there */     ppc_ftoui.S:61:     blt     __fixsfsi               /* return directly form there */
ppc_dtoui.S:63:     blt     __fixdfsi
ppc_dtoui.S:73:     blt     __fixdfsi

I've sent an email to the sourceforge maintainer, but I haven't heard anything yet. It's a great library, it greatly improves FP performance. Anyone else been using it? Any problems?

My fix is attached.

Joshua

Signature · 11 lines
Xiphos Technologies
(514) 848-9640 x227
(514) 848-9644 fax

www.xiplink.com
_______________________________________________
The information transmitted is intended only for the
person or entity to which it is addressed and may contain
confidential and/or privileged material.  If you have
received this in error, please contact the sender and delete
this communication and any copy immediately. Thank you.
fpopt/ppc_dtoui.S +14 -2
@@ -53,14 +53,26 @@ function_prolog(__fixunsdfsi)
 
 /* For negative numbers, just convert to signed integer */
      or.     r3,r3,r3      
-     blt     __fixdfsi               /* return directly from there */      
+#if defined(__KERNEL__) && defined(MODULE)
+     bge     positive
+     bl     __fixdfsi               /* return directly from there */      
+#else
+     blt     __fixdfsi
+#endif
      
+positive:	     
      rlwinm  r8,r3,12,0x000007FF      /* extract exponent */
 /* For numbers less than maximum positive signed integer, convert normally */     
      cmpwi   r8, 0x041e     
-     blt     __fixdfsi               /* return directly form there */
+#if defined(__KERNEL__) && defined(MODULE)
+     bge     overmax 
+     bl     __fixdfsi               /* return directly form there */
+#else
+     blt     __fixdfsi
+#endif
      
 /* Create stack frame, just to save link register! */
+overmax:
      mflr    r0                      /* save link register in caller's stack */
      stw     r0,4(r1)               
      stwu    r1,-STACKSIZE(r1)       /* set up stack frame to hold saved regs */
fpopt/ppc_ftoui.S +14 -2
@@ -53,14 +53,26 @@ function_prolog(__fixunssfsi)
 
 /* For negative numbers, just convert to signed integer */
      or.     r3,r3,r3      
-     blt     __fixsfsi               /* return directly from there */      
+#if defined(__KERNEL__) && defined(MODULE)
+     bge     positive
+     bl      __fixsfsi               /* return directly from there */      
+#else
+     blt     __fixsfsi
+#endif	
      
+positive:
      rlwinm  r8,r3,9,0x000000FF      /* extract exponent */
 /* For numbers less than maximum positive signed integer, convert normally */     
      cmpwi   r8, 0x009e     
-     blt     __fixsfsi               /* return directly form there */
+#if defined(__KERNEL__) && defined(MODULE)
+     bge     overmax 
+     bl      __fixsfsi               /* return directly form there */
+#else
+     blt     __fixsfsi
+#endif
      
 /* Create stack frame, just to save link register! */
+overmax:
      mflr    r0                      /* save link register in caller's stack */
      stw     r0,4(r1)               
      stwu    r1,-STACKSIZE(r1)       /* set up stack frame to hold saved regs */