Иллюстрированный самоучитель по теории операционных систем

Позиционно-независимый код

Пример 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.