Hi there, we use Pistachio's system-call bindings in shared libraries, so we compiled them as position independent code (-fPIC). While there is already PIC support within the bindings, we still got text-relocations in our shared libraries. We fixed these issues for our purposes and I just wanted to share the patch here.
Greetings, -- Sebastian Sumpf http://www.genode-labs.com ยท http://genode.org
# HG changeset patch # Parent b205e69908fea43e434a0ac04232d88ad758f890 diff -r b205e69908fe user/include/l4/ia32/syscalls.h --- a/user/include/l4/ia32/syscalls.h Mon Sep 13 19:40:40 2010 +0200 +++ b/user/include/l4/ia32/syscalls.h Mon Oct 11 15:10:52 2010 +0200 @@ -47,6 +47,28 @@ # define __L4_CLOBBER_REGS "ebx", "cc" #endif +#ifdef __cplusplus +#define _C_ "C" +#else +#define _C_ +#endif + +/* + * Note: We do not call the __L4*-functions from inline assembly any more, + * instead we pass the pointers as input operands. This way there is no need for + * the linker to generate text relocations for position independent code. + */ +extern _C_ void __L4_ExchangeRegisters(void); +extern _C_ void __L4_ThreadControl(void); +extern _C_ void __L4_SystemClock(void); +extern _C_ void __L4_ThreadSwitch(void); +extern _C_ void __L4_Schedule(void); +extern _C_ void __L4_Ipc(void); +extern _C_ void __L4_Lipc(void); +extern _C_ void __L4_Unmap(void); +extern _C_ void __L4_SpaceControl(void); +extern _C_ void __L4_ProcessorControl(void); +extern _C_ void __L4_MemoryControl(void); L4_INLINE void * L4_KernelInterface (L4_Word_t *ApiVersion, L4_Word_t *ApiFlags, @@ -95,32 +117,35 @@ L4_Word_t esi; } in; - in.ebp = pager.raw; - in.ebx = UserDefHandle; - in.esi = ip; - in.edi = flags; + in.ebp = pager.raw; + in.ebx = UserDefHandle; + in.esi = ip; + in.edi = flags; __asm__ __volatile__ ( "/* L4_ExchangeRegisters() */ \n" __L4_SAVE_REGS " pushl %%esi \n" + " pushl %%edi \n" " movl (%%esi), %%ebp \n" " movl 4(%%esi), %%edi \n" " movl 8(%%esi), %%ebx \n" " movl 12(%%esi), %%esi \n" - " call __L4_ExchangeRegisters \n" - " xchgl %%esi, (%%esp) \n" + " call *(%%esp) \n" + " xchgl %%esi, 4(%%esp) \n" " movl %%edi, 4(%%esi) \n" " movl %%ebx, 8(%%esi) \n" " movl %%ebp, (%%esi) \n" + " popl %%edi \n" " popl %%esi \n" __L4_RESTORE_REGS : "=a" (result), "=c" (*old_control), "=d" (*old_sp), "=S" (*old_ip) : - "a" (dest.raw), "c" (control), "d" (sp), "S" (&in) + "a" (dest.raw), "c" (control), "d" (sp), "S" (&in), + "D" (__L4_ExchangeRegisters) : - "edi", "memory", __L4_CLOBBER_REGS); + "memory", __L4_CLOBBER_REGS); old_pager->raw = in.ebp; *old_flags = in.edi; @@ -141,7 +166,9 @@ __asm__ __volatile__ ( "/* L4_ThreadControl() */ \n" __L4_SAVE_REGS - " call __L4_ThreadControl \n" + " movl %%edi, %%ebx \n" + " movl %9, %%edi \n" + " call *%%ebx \n" __L4_RESTORE_REGS : /* outputs */ @@ -156,7 +183,8 @@ "1" (Pager), "2" (Scheduler), "3" (SpaceSpecifier), - "4" (UtcbLocation) + "m" (UtcbLocation), + "D" (__L4_ThreadControl) : /* clobbers */ __L4_CLOBBER_REGS); @@ -171,14 +199,14 @@ __asm__ __volatile__ ( "/* L4_SystemClock() */ \n" - " call __L4_SystemClock \n" - + " call *%%ecx \n" : /* outputs */ "=A" (result.raw) - : /* no inputs */ + : + "c" (__L4_SystemClock) : /* clobbers */ - "ecx", "esi", "edi"); + "esi", "edi"); return result; } @@ -188,12 +216,13 @@ { __asm__ __volatile__ ( "/* L4_ThreadSwitch() */ \n" - " call __L4_ThreadSwitch \n" + " call *%%ecx \n" : /* no outputs */ : /* inputs */ - "a" (dest) + "a" (dest), + "c" (__L4_ThreadSwitch) /* no clobbers */ ); @@ -213,7 +242,9 @@ __asm__ __volatile__ ( "/* L4_Schedule() */ \n" __L4_SAVE_REGS - " call __L4_Schedule \n" + " movl %%edi, %%ebx \n" + " movl %9, %%edi \n" + " call *%%ebx \n" __L4_RESTORE_REGS : /* outputs */ @@ -228,7 +259,8 @@ "1" (PrioControl), "2" (TimeControl), "3" (ProcessorControl), - "4" (PreemptionControl) + "m" (PreemptionControl), + "D" (__L4_Schedule) : /* clobbers */ __L4_CLOBBER_REGS); @@ -246,10 +278,13 @@ L4_Word_t * utcb = __L4_X86_Utcb (); #if defined(__pic__) + __asm__ __volatile__ ( "/* L4_Ipc() */ \n" __L4_SAVE_REGS - " call __L4_Ipc \n" + " movl %%eax, %%ebx \n" + " movl %5, %%eax \n" + " call *%%ebx \n" " movl %%ebp, %%ecx \n" " movl %%ebx, %%edx \n" __L4_RESTORE_REGS @@ -262,11 +297,13 @@ : /* inputs */ "S" (utcb[0]), - "a" (to.raw), - "D" (utcb), + "m" (to.raw), + "D" (utcb), "c" (Timeouts), - "d" (FromSpecifier) + "d" (FromSpecifier), + "a" (__L4_Ipc) ); + #else L4_Word_t dummy; @@ -282,7 +319,7 @@ "=a" (result), "=b" (mr1), "=c" (mr2), - "=d" (dummy) + "=d" (dummy) : /* inputs */ "S" (utcb[0]), @@ -317,8 +354,10 @@ __asm__ __volatile__ ( "/* L4_Lipc() */ \n" __L4_SAVE_REGS - " call __L4_Lipc \n" - " movl %%ebp, %%ecx \n" + " movl %%eax, %%ebx \n" + " movl %5, %%eax \n" + " call *%%ebx \n" + " movl %%ebp, %%ecx \n" " movl %%ebx, %%edx \n" __L4_RESTORE_REGS @@ -330,10 +369,11 @@ : /* inputs */ "S" (utcb[0]), - "a" (to.raw), - "D" (utcb), + "m" (to.raw), + "D" (utcb), "c" (Timeouts), - "d" (FromSpecifier) + "d" (FromSpecifier), + "a" (__L4_Lipc) ); #else L4_Word_t dummy; @@ -344,7 +384,7 @@ " call __L4_Lipc \n" " movl %%ebp, %%ecx \n" __L4_RESTORE_REGS - + : /* outputs */ "=S" (mr0), "=a" (result), @@ -355,7 +395,7 @@ : /* inputs */ "S" (utcb[0]), "a" (to.raw), - "D" (utcb), + "D" (utcb), "c" (Timeouts), "d" (FromSpecifier) ); @@ -378,7 +418,7 @@ __asm__ __volatile__ ( "/* L4_Unmap() */ \n" __L4_SAVE_REGS - " call __L4_Unmap \n" + " call *%%ecx \n" __L4_RESTORE_REGS : /* outputs */ @@ -389,10 +429,11 @@ : /* inputs */ "0" (utcb[0]), "1" (utcb), - "2" (control) + "2" (control), + "c" (__L4_Unmap) : /* clobbered */ - "ecx", "edx", __L4_CLOBBER_REGS); + "edx", __L4_CLOBBER_REGS); } @@ -408,7 +449,9 @@ __asm__ __volatile__ ( "/* L4_SpaceControl() */ \n" __L4_SAVE_REGS - " call __L4_SpaceControl \n" + " movl %%edi, %%ebx \n" + " movl %9, %%edi \n" + " call *%%ebx \n" __L4_RESTORE_REGS : /* outputs */ @@ -423,7 +466,8 @@ "1" (control), "2" (KernelInterfacePageArea), "3" (UtcbArea), - "4" (redirector) + "m" (redirector), + "D" (__L4_SpaceControl) : /* clobbers */ __L4_CLOBBER_REGS); @@ -442,7 +486,7 @@ __asm__ __volatile__ ( "/* L4_ProcessorControl() */ \n" __L4_SAVE_REGS - " call __L4_ProcessorControl \n" + " call *%%edi \n" __L4_RESTORE_REGS : /* outputs */ @@ -456,7 +500,8 @@ "0" (ProcessorNo), "1" (InternalFrequency), "2" (ExternalFrequency), - "3" (voltage) + "3" (voltage), + "4" (__L4_ProcessorControl) : /* clobbers */ __L4_CLOBBER_REGS); @@ -474,11 +519,14 @@ __asm__ __volatile__ ( "/* L4_MemoryControl() */ \n" __L4_SAVE_REGS + " pushl %%edi \n" + " movl %8, %%edi \n" " movl 12(%6), %%ebp \n" " movl 8(%6), %%ebx \n" " movl 4(%6), %%edx \n" " movl (%6), %%ecx \n" - " call __L4_MemoryControl \n" + " call *(%%esp) \n" + " popl %%edi \n" __L4_RESTORE_REGS : /* outputs */ @@ -492,7 +540,8 @@ "0" (control), "1" (attributes), "3" (utcb[0]), - "4" (utcb) + "m" (utcb), + "4" (__L4_MemoryControl) : /* clobbers */ __L4_CLOBBER_REGS);