Позиционно-независимый код
Пример 3.7. Позиционно-независимый код, порождаемый компилятором GNU С:
/* strerror.c (emx+gcc) – Copyright (с) 1990-1996 by Eberhard Mattes */ #include <stdlib.h> #include <string.h> #include <emx/thread.h> char *strerror (int errnum) { ( if (errnum >= 0 && errnum < _sys_nerr) return (char *)_sys_errlist [errnum]; else { static char msg[] = "Unknown error "; #if defined (_ MT _) struct _thread *tp = _thread (); #define result (tp › _th_error) #else static char result [32]; #endif memcpy (result, msg, sizeof (rasg) -1); _itoa (errnum, result + sizeof (msg) -1, 10); return result; } } gcc -f PIC -S strerror.c .file "strerror" gcc2_compiled.: _ gnu_compiled_c: .data _msg.2: .ascii "Unknown error \0" .Icomm _result.3.32 .text .align 2, 0x90 .globl _strerror __strerror: pushl %ebp movl %esp, %ebp pushl %ebx call L4 L4: popl %ebx addl $_GLOBAL_OFFSET_TABLE_+ [. -L4 ], %ebx cmpl $0.8 (%ebp) jl L2 movl _ sys_nerr@GOT (%ebx), %eax movl 8 (%ebp), %edx cmpl %edx, (%eax) jle L2 movl 8(%ebp),%eax movl %eax,%edx leal 0(,%edx,4),%eax movl __sys_errlist@GOT(%ebx), %edx movl (%edx,%eax),%eax jmp LI .align 2.0x90 jmp L3.align 2.0x90 L2: pushl $14 leal _msg.2@GOTOFF(%ebx),%edx movl %edx,%eax pushl %eax leal _result.3@GOTOFF(%ebx),%edx movl %edx,%eax pushl %eax call _memcpy@PLT addl $12,%esp pushl $10 leal _result.3@GOTOFF(%ebx), %edx leal 14(%edx),%eax pushl %eax movl 8(%ebp),%eax pushl %eax call __itoa@PLT addl $12,%esp leal _result.3@GOTOFF(%ebx),%edx movl %edx,%eax jmp LI .align 2.0x90 L3: LI: movl -4 (%ebp),%ebx leave ret