summaryrefslogtreecommitdiff
path: root/hw/xfree86/loader/loader.c
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2006-06-01 20:18:30 +0000
committerDaniel Stone <daniel@fooishbar.org>2006-06-01 20:18:30 +0000
commitc9468177486833d521ec62c7b0266b4be8200de7 (patch)
tree5d6976c35147d5d16c22350032661a37f53d8f5f /hw/xfree86/loader/loader.c
parenta3a4221495dfe4cc0a3874a08dd5364ef45a7f2e (diff)
Kill a.out, COFF and ELF loaders with FIRE.
Diffstat (limited to 'hw/xfree86/loader/loader.c')
-rw-r--r--hw/xfree86/loader/loader.c381
1 files changed, 1 insertions, 380 deletions
diff --git a/hw/xfree86/loader/loader.c b/hw/xfree86/loader/loader.c
index 4c904128e..f59e1ec4b 100644
--- a/hw/xfree86/loader/loader.c
+++ b/hw/xfree86/loader/loader.c
@@ -69,9 +69,6 @@
#include <malloc.h>
#endif
#include <stdarg.h>
-#include "ar.h"
-#include "elf.h"
-#include "coff.h"
#include "os.h"
#include "sym.h"
@@ -259,88 +256,23 @@ static int fatalReqSym = 0;
static int _GetModuleType(int, long);
static loaderPtr _LoaderListPush(void);
static loaderPtr _LoaderListPop(int);
- /*ARGSUSED*/ static void
-ARCHIVEResolveSymbols(void *unused)
-{
-}
- /*ARGSUSED*/ static int
-ARCHIVECheckForUnresolved(void *v)
-{
- return 0;
-}
/*ARGSUSED*/ static char *
ARCHIVEAddressToSection(void *modptr, unsigned long address)
{
return NULL;
}
- /*ARGSUSED*/ static void
-ARCHIVEUnload(void *unused2)
-{
-}
/*
* Array containing entry points for different formats.
*/
static loader_funcs funcs[] = {
- /* LD_ARCHIVE */
- {ARCHIVELoadModule,
- ARCHIVEResolveSymbols,
- ARCHIVECheckForUnresolved,
- ARCHIVEAddressToSection,
- ARCHIVEUnload, {0, 0, 0, 0, 0}},
- /* LD_ELFOBJECT */
- {ELFLoadModule,
- ELFResolveSymbols,
- ELFCheckForUnresolved,
- ELFAddressToSection,
- ELFUnloadModule, {0, 0, 0, 0, 0}},
- /* LD_COFFOBJECT */
- {COFFLoadModule,
- COFFResolveSymbols,
- COFFCheckForUnresolved,
- COFFAddressToSection,
- COFFUnloadModule, {0, 0, 0, 0, 0}},
- /* LD_XCOFFOBJECT */
- {COFFLoadModule,
- COFFResolveSymbols,
- COFFCheckForUnresolved,
- COFFAddressToSection,
- COFFUnloadModule, {0, 0, 0, 0, 0}},
- /* LD_AOUTOBJECT */
- {AOUTLoadModule,
- AOUTResolveSymbols,
- AOUTCheckForUnresolved,
- AOUTAddressToSection,
- AOUTUnloadModule, {0, 0, 0, 0, 0}},
- /* LD_AOUTDLOBJECT */
-#ifdef DLOPEN_SUPPORT
- {DLLoadModule,
- DLResolveSymbols,
- DLCheckForUnresolved,
- ARCHIVEAddressToSection,
- DLUnloadModule, {0, 0, 0, 0, 0}},
-#else
- {AOUTLoadModule,
- AOUTResolveSymbols,
- AOUTCheckForUnresolved,
- AOUTAddressToSection,
- AOUTUnloadModule, {0, 0, 0, 0, 0}},
-#endif
/* LD_ELFDLOBJECT */
-#ifdef DLOPEN_SUPPORT
{DLLoadModule,
DLResolveSymbols,
DLCheckForUnresolved,
ARCHIVEAddressToSection,
DLUnloadModule, {0, 0, 0, 0, 0}},
-#else
- {ELFLoadModule,
- ELFResolveSymbols,
- ELFCheckForUnresolved,
- ELFAddressToSection,
- ELFUnloadModule, {0, 0, 0, 0, 0}},
-#endif
};
int numloaders = sizeof(funcs) / sizeof(loader_funcs);
@@ -434,69 +366,7 @@ LoaderInit(void)
static int
_GetModuleType(int fd, long offset)
{
- unsigned char buf[256]; /* long enough for the largest magic type */
-
- if (read(fd, buf, sizeof(buf)) < 0) {
- return -1;
- }
-#ifdef DEBUG
- ErrorF("Checking module type %10s\n", buf);
- ErrorF("Checking module type %x %x %x %x\n", buf[0], buf[1], buf[2],
- buf[3]);
-#endif
-
- lseek(fd, offset, SEEK_SET);
-
- if (strncmp((char *)buf, ARMAG, SARMAG) == 0) {
- return LD_ARCHIVE;
- }
-#if defined(AIAMAG)
- /* LynxOS PPC style archives */
- if (strncmp((char *)buf, AIAMAG, SAIAMAG) == 0) {
- return LD_ARCHIVE;
- }
-#endif
-
- if (strncmp((char *)buf, ELFMAG, SELFMAG) == 0) {
- if (*((Elf32_Half *) (buf + ELFDLOFF)) == ELFDLMAG) {
- return LD_ELFDLOBJECT;
- } else {
- return LD_ELFOBJECT;
- }
- }
-
- if (buf[0] == 0x4c && buf[1] == 0x01) {
- /* I386MAGIC */
- return LD_COFFOBJECT;
- }
- if (buf[0] == 0x01 && buf[1] == 0xdf) {
- /* XCOFFMAGIC */
- return LD_COFFOBJECT;
- }
- if (buf[0] == 0x0d && buf[1] == 0x01) {
- /* ZCOFFMAGIC (LynxOS) */
- return LD_COFFOBJECT;
- }
- if (buf[0] == 0x00 && buf[1] == 0x86 && buf[2] == 0x01 && buf[3] == 0x07) {
- /* AOUTMAGIC */
- return LD_AOUTOBJECT;
- }
- if (buf[0] == 0x07 && buf[1] == 0x01
- && (buf[2] == 0x64 || buf[2] == 0x86)) {
- /* AOUTMAGIC, (Linux OMAGIC, old impure format, also used by OS/2 */
- return LD_AOUTOBJECT;
- }
- if (buf[0] == 0x07 && buf[1] == 0x01 && buf[2] == 0x00 && buf[3] == 0x00) {
- /* AOUTMAGIC, BSDI */
- return LD_AOUTOBJECT;
- }
- if ((buf[0] == 0xc0 && buf[1] == 0x86) || /* big endian form */
- (buf[3] == 0xc0 && buf[2] == 0x86)) { /* little endian form */
- /* i386 shared object */
- return LD_AOUTDLOBJECT;
- }
-
- return LD_UNKNOWN;
+ return LD_ELFDLOBJECT;
}
static int offsetbias = 0; /* offset into archive */
@@ -972,255 +842,6 @@ _LoaderHandleUnresolved(char *symbol, char *module)
}
/*
- * Handle an archive.
- */
-void *
-ARCHIVELoadModule(loaderPtr modrec, int arfd, LOOKUP ** ppLookup, int flags)
-{
- loaderPtr tmp = NULL;
- void *ret = NULL;
- unsigned char magic[SARMAG];
- struct ar_hdr hdr;
-
-#if defined(__powerpc__) && defined(Lynx)
- struct fl_hdr fhdr;
- char name[255];
- int namlen;
-#endif
- unsigned int size;
- unsigned int offset;
- int arnamesize, modnamesize;
- char *slash, *longname;
- char *nametable = NULL;
- int nametablelen = 0;
- LOOKUP *lookup_ret, *p;
- LOOKUP *myLookup = NULL; /* Does realloc behave if ptr == 0? */
- int modtype;
- int i;
- int numsyms = 0;
-
- /* lookup_ret = xf86loadermalloc(sizeof (LOOKUP *)); */
-
- arnamesize = strlen(modrec->name);
-
-#if !(defined(__powerpc__) && defined(Lynx))
- read(arfd, magic, SARMAG);
-
- if (strncmp((const char *)magic, ARMAG, SARMAG) != 0) {
- ErrorF("ARCHIVELoadModule: wrong magic!!\n");
- return NULL;
- }
-#else
- read(arfd, &fhdr, FL_HSZ);
-
- if (strncmp(fhdr.fl_magic, AIAMAG, SAIAMAG) != 0) {
- ErrorF("ARCHIVELoadModule: wrong magic!!\n");
- return NULL;
- }
-#endif /* __powerpc__ && Lynx */
-
-#ifdef DEBUGAR
- ErrorF("Looking for archive members starting at offset %o\n", offset);
-#endif
-
- while (read(arfd, &hdr, sizeof(struct ar_hdr))) {
-
- longname = NULL;
- sscanf(hdr.ar_size, "%u", &size);
-#if defined(__powerpc__) && defined(Lynx)
- sscanf(hdr.ar_namlen, "%d", &namlen);
- name[0] = hdr.ar_name[0];
- name[1] = hdr.ar_name[1];
- read(arfd, &name[2], namlen);
- name[namlen] = '\0';
- offset = lseek(arfd, 0, SEEK_CUR);
- if (offset & 0x1) /* odd value */
- offset = lseek(arfd, 1, SEEK_CUR); /* make it an even boundary */
-#endif
- offset = lseek(arfd, 0, SEEK_CUR);
-
- /* Check for a Symbol Table */
- if ((hdr.ar_name[0] == '/' && hdr.ar_name[1] == ' ') ||
-#if defined(__powerpc__) && defined(Lynx)
- namlen == 0 ||
-#endif
- strncmp(hdr.ar_name, "__.SYMDEF", 9) == 0) {
- /* If the file name is NULL, then it is a symbol table */
-#ifdef DEBUGAR
- ErrorF("Symbol Table Member '%16.16s', size %d, offset %d\n",
- hdr.ar_name, size, offset);
- ErrorF("Symbol table size %d\n", size);
-#endif
- offset = lseek(arfd, offset + size, SEEK_SET);
- if (offset & 0x1) /* odd value */
- offset = lseek(arfd, 1, SEEK_CUR); /* make it an even boundary */
- continue;
- }
-
- /* Check for a String Table */
- if (hdr.ar_name[0] == '/' && hdr.ar_name[1] == '/') {
- /* If the file name is '/', then it is a string table */
-#ifdef DEBUGAR
- ErrorF("String Table Member '%16.16s', size %d, offset %d\n",
- hdr.ar_name, size, offset);
- ErrorF("String table size %d\n", size);
-#endif
- nametablelen = size;
- nametable = (char *)xf86loadermalloc(nametablelen);
- read(arfd, nametable, size);
- offset = lseek(arfd, 0, SEEK_CUR);
- /* offset=lseek(arfd,offset+size,SEEK_SET); */
- if (offset & 0x1) /* odd value */
- offset = lseek(arfd, 1, SEEK_CUR); /* make it an even boundary */
- continue;
- }
-
- if (hdr.ar_name[0] == '/') {
- /* SYS V r4 style long member name */
- int nameoffset = atol(&hdr.ar_name[1]);
- char *membername;
-
- if (!nametable) {
- ErrorF("Missing string table whilst processing %s\n",
- modrec->name);
- offsetbias = 0;
- return NULL;
- }
- if (nameoffset > nametablelen) {
- ErrorF("Invalid string table offset (%s) whilst processing %s\n", hdr.ar_name, modrec->name);
- offsetbias = 0;
- xf86loaderfree(nametable);
- return NULL;
- }
- membername = nametable + nameoffset;
- slash = strchr(membername, '/');
- if (slash)
- *slash = '\0';
- longname = xf86loadermalloc(arnamesize + strlen(membername) + 2);
- strcpy(longname, modrec->name);
- strcat(longname, ":");
- strcat(longname, membername);
- } else if (hdr.ar_name[0] == '#' && hdr.ar_name[1] == '1' &&
- hdr.ar_name[2] == '/') {
- /* BSD 4.4 style long member name */
- if (sscanf(hdr.ar_name + 3, "%d", &modnamesize) != 1) {
- ErrorF("Bad archive member %s\n", hdr.ar_name);
- offsetbias = 0;
- return NULL;
- }
- /* allocate space for fully qualified name */
- longname = xf86loadermalloc(arnamesize + modnamesize + 2);
- strcpy(longname, modrec->name);
- strcat(longname, ":");
- i = read(arfd, longname + modnamesize + 1, modnamesize);
- if (i != modnamesize) {
- ErrorF("Bad archive member %s\n", hdr.ar_name);
- xf86loaderfree(longname);
- offsetbias = 0;
- return NULL;
- }
- longname[i] = '\0';
- offset += i;
- size -= i;
- } else {
- /* Regular archive member */
-#ifdef DEBUGAR
- ErrorF("Member '%16.16s', size %d, offset %x\n",
-#if !(defined(__powerpc__) && defined(Lynx))
- hdr.ar_name,
-#else
- name,
-#endif
- size, offset);
-#endif
-
- slash = strchr(hdr.ar_name, '/');
- if (slash == NULL) {
- /* BSD format without trailing slash */
- slash = strchr(hdr.ar_name, ' ');
- }
- /* SM: Make sure we do not overwrite other parts of struct */
-
- if ((slash - hdr.ar_name) > sizeof(hdr.ar_name))
- slash = hdr.ar_name + sizeof(hdr.ar_name) - 1;
- *slash = '\000';
- }
- if ((modtype = _GetModuleType(arfd, offset)) < 0) {
- ErrorF("%s is an unrecognized module type\n", hdr.ar_name);
- offsetbias = 0;
- if (nametable)
- xf86loaderfree(nametable);
- return NULL;
- }
-
- tmp = _LoaderListPush();
-
- tmp->handle = modrec->handle;
- tmp->module = moduleseq++;
- tmp->cname = xf86loadermalloc(strlen(modrec->cname) + 1);
- strcpy(tmp->cname, modrec->cname);
- tmp->funcs = &funcs[modtype];
- if (longname == NULL) {
- modnamesize = strlen(hdr.ar_name);
- tmp->name =
- (char *)xf86loadermalloc(arnamesize + modnamesize + 2);
- strcpy(tmp->name, modrec->name);
- strcat(tmp->name, ":");
- strcat(tmp->name, hdr.ar_name);
-
- } else {
- tmp->name = longname;
- }
- offsetbias = offset;
-
- if ((tmp->private = funcs[modtype].LoadModule(tmp, arfd, &lookup_ret, LD_FLAG_GLOBAL))
- == NULL) {
- ErrorF("Failed to load %s\n", hdr.ar_name);
- offsetbias = 0;
- if (nametable)
- xf86loaderfree(nametable);
- return NULL;
- }
-
- offset = lseek(arfd, offset + size, SEEK_SET);
- if (offset & 0x1) /* odd value */
- lseek(arfd, 1, SEEK_CUR); /* make it an even boundary */
-
- if (tmp->private == (void *)-1L) {
- xf86Msg(X_INFO, "Skipping \"%s\": "
- "object file contains no symbols\n",
- tmp->name);
- continue;
- } else
- ret = tmp->private;
-
- /* Add the lookup table returned from funcs.LoadModule to the
- * one we're going to return.
- */
- for (i = 0, p = lookup_ret; p && p->symName; i++, p++) ;
- if (i) {
- myLookup = xf86loaderrealloc(myLookup, (numsyms + i + 1)
- * sizeof(LOOKUP));
- if (!myLookup)
- continue; /* Oh well! */
-
- memcpy(&(myLookup[numsyms]), lookup_ret, i * sizeof(LOOKUP));
- numsyms += i;
- myLookup[numsyms].symName = 0;
- }
- xf86loaderfree(lookup_ret);
- }
- /* xf86loaderfree(lookup_ret); */
- offsetbias = 0;
-
- *ppLookup = myLookup;
- if (nametable)
- xf86loaderfree(nametable);
-
- return ret;
-}
-
-/*
* Relocation list manipulation routines
*/