1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
#include "bsd.h"
#ifndef __ELF__
#error Linux systems use ELF
#endif
#undef HAVE_AOUT
/* #define HAVE_AOUT <elf.h> */
#define HAVE_ELF
/* Seeking to the end of ELF data is a little messy... */
#include <link.h>
#define SEEK_TO_END_OFILE(fp)\
do { \
long offset = 0, endofelf; int j; \
ElfW(Ehdr) eheader; ElfW(Shdr) shdr; \
fseek(fp, 0, SEEK_SET); \
massert(1==fread(&eheader, sizeof(eheader), 1, fp)); \
/* in case the headers themselves come AFTER the actual sections */ \
endofelf=offset = eheader.e_shoff+ eheader.e_shentsize *eheader.e_shnum;\
fseek(fp, eheader.e_shoff, SEEK_SET); \
if ( eheader.e_shentsize != sizeof(ElfW(Shdr)) ) \
{ FEerror("Bad ELF section header size",0); } \
for ( j = 0; j < eheader.e_shnum; j++ ) \
{ massert(1==fread(&shdr,eheader.e_shentsize,1,fp)); \
if ( (shdr.sh_offset > offset) && (shdr.sh_type != SHT_NOBITS) ) \
{ offset = shdr.sh_offset; endofelf = offset+shdr.sh_size; } \
} \
if ( fseek(fp, endofelf, SEEK_SET) ) \
FEerror("Bad ELF file",0); \
} while(0)
#ifdef IN_GBC
/* Based upon sun4.h */
#define MPROTECT_ACTION_FLAGS SA_RESTART
#define INSTALL_MPROTECT_HANDLER \
do {static struct sigaction action; \
action.sa_handler = (void *)memprotect_handler; \
action.sa_flags = MPROTECT_ACTION_FLAGS; \
/*action.sa_restorer = 0;*/ \
sigemptyset(&action.sa_mask); \
sigaddset(&action.sa_mask,SIGINT); \
sigaddset(&action.sa_mask,SIGALRM); \
sigaction(SIGSEGV,&action,0); \
sigaction(SIGBUS,&action,0);} while (0)
#endif
/* #define ELF_TEXT_BASE 0x0/\* DBEGIN *\/ */
/* #undef SET_REAL_MAXPAGE */
/* #define SET_REAL_MAXPAGE do { struct rlimit data_rlimit; \ */
/* extern char etext; \ */
/* real_maxpage = MAXPAGE ;\ */
/* getrlimit(RLIMIT_DATA, &data_rlimit); \ */
/* real_maxpage = ((unsigned long)&etext/PAGESIZE \ */
/* + data_rlimit.rlim_cur/PAGESIZE - ELF_TEXT_BASE/PAGESIZE); \ */
/* if (real_maxpage > MAXPAGE) \ */
/* real_maxpage = MAXPAGE ; } while(0) */
#ifdef USE_DLOPEN
#define SPECIAL_RSYM "rsym_elf.c"
#define SEPARATE_SFASL_FILE "fasldlsym.c"
#else
#ifdef HAVE_LIBBFD
#define SEPARATE_SFASL_FILE "sfaslbfd.c"
#else
/* #if !defined(__i386__) && !defined(__sparc__) */
/* #error Can only do non-bfd relocs for i386 and sparc */
/* #endif */
#define SPECIAL_RSYM "rsym_elf.c"
#define SEPARATE_SFASL_FILE "sfaslelf.c"
#endif
#endif
#define UNEXEC_USE_MAP_PRIVATE
#define UNIXSAVE "unexelf.c"
#undef HAVE_SIGVEC
#define HAVE_SIGACTION
#ifndef HAVE_SV_ONSTACK
#define SV_ONSTACK 0
#endif
/* unblock signals m and n, and set val to signal_mask(m) | signal_mask(n)
if they were set */
/* #define SIG_UNBLOCK_SIGNALS(val,m,n) \ */
/* current_mask = sigblock(0); \ */
/* sigsetmask(~(sigmask(m)) & ~(sigmask(n)) & current_mask); \ */
/* result = (current_mask & sigmask(m) ? signal_mask(m) : 0) \ */
/* | (current_mask & sigmask(n) ? signal_mask(n) : 0); */
#define RUN_PROCESS
#define IEEEFLOAT
/* #define HAVE_XDR */
#define USE_ULONG_
/* How to check for input */
#undef LISTEN_FOR_INPUT
#define LISTEN_FOR_INPUT(fp) \
do { int c = 0; \
if((((FILE *)fp)->_IO_read_ptr >= ((FILE *)fp)->_IO_read_end) \
&& (ioctl(((FILE *)fp)->_fileno, FIONREAD, &c),c<=0)) \
return 0;} while (0)
/* #define DATA_BEGIN((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1)); */
#define DATA_BEGIN (char *)(char *)N_DATADDR(header);
#define PAGSIZ (NBPG)
#define SEGSIZ (NBPG * CLSIZE)
#define TXTRELOC 0
#define USE_DIRENT
#define GETPATHNAME
#define PATHNAME_CACHE 10
/* get the fileno of a FILE* */
#define FILENO(x) fileno(x)
#define ULONG_DEFINED
#undef LD_COMMAND
#define LD_COMMAND(command,main,start,input,ldarg,output) \
sprintf(command, "ld -d -S -N -x -A %s -T %x %s %s -o %s", \
main,start,input,ldarg,output)
#define SET_SESSION_ID() (setpgrp() ? -1 : 0)
#include <limits.h>
#include <sys/stat.h>
#define GET_FULL_PATH_SELF(a_) do { \
static char q[PATH_MAX]; \
massert(which("/proc/self/exe",q) || which(argv[0],q)); \
(a_)=q; \
} while(0)
#define UC(a_) ((ucontext_t *)a_)
#define SF(a_) ((siginfo_t *)a_)
#if defined(__linux__) && (defined(__x86_64__) || defined(__i386__))
/* #define FPE_CODE(i_) make_fixnum((fixnum)SF(i_)->si_code) */
#ifdef __i386__
#define FPE_CODE(i_,v_) make_fixnum((long)FFN(fSfpe_code)(UC(v_)->uc_mcontext.fpregs->sw,((struct _fpstate *)UC(v_)->uc_mcontext.fpregs)->mxcsr))
#define FPE_ADDR(i_,v_) make_fixnum((UC(v_)->uc_mcontext.fpregs->tag!=-1) ? UC(v_)->uc_mcontext.fpregs->ipoff : (fixnum)SF(i_)->si_addr)
#else
#define FPE_CODE(i_,v_) make_fixnum((long)FFN(fSfpe_code)(UC(v_)->uc_mcontext.fpregs->swd,((struct _fpstate *)UC(v_)->uc_mcontext.fpregs)->mxcsr))
#define FPE_ADDR(i_,v_) make_fixnum(UC(v_)->uc_mcontext.fpregs->fop ? UC(v_)->uc_mcontext.fpregs->rip : (fixnum)SF(i_)->si_addr)
#endif
#define FPE_CTXT(v_) list(3,make_fixnum((fixnum)&UC(v_)->uc_mcontext.gregs), \
make_fixnum((fixnum)&UC(v_)->uc_mcontext.fpregs->_st), \
make_fixnum((fixnum)&((struct _fpstate *)UC(v_)->uc_mcontext.fpregs)->_xmm))
#define MC(b_) v.uc_mcontext.b_
#define REG_LIST(a_) MMcons(make_fixnum(sizeof(a_)),make_fixnum(sizeof(*a_)))
#define MCF(b_) (((struct _fpstate *)MC(fpregs))->b_)
#ifdef __x86_64__
#define FPE_RLST "R8 R9 R10 R11 R12 R13 R14 R15 RDI RSI RBP RBX RDX RAX RCX RSP RIP EFL CSGSFS ERR TRAPNO OLDMASK CR2"
#elif defined(__i386__)
#define FPE_RLST "GS FS ES DS EDI ESI EBP ESP EBX EDX ECX EAX TRAPNO ERR EIP CS EFL UESP SS"
#else
#error Missing reg list
#endif
#define FPE_INIT ({ucontext_t v;list(3,MMcons(make_simple_string(({const char *s=FPE_RLST;s;})),REG_LIST(MC(gregs))),\
REG_LIST(MCF(_st)),REG_LIST(MCF(_xmm)));})
#else
#define FPE_CODE(i_,v_) make_fixnum((fixnum)SF(i_)->si_code)
#define FPE_ADDR(i_,v_) make_fixnum((fixnum)SF(i_)->si_addr)
#define FPE_CTXT(v_) Cnil
#define FPE_INIT Cnil
#endif
|