Added ELF support master
authorRobert Pengelly <robertapengelly@hotmail.com>
Mon, 24 Mar 2025 03:10:52 +0000 (03:10 +0000)
committerRobert Pengelly <robertapengelly@hotmail.com>
Mon, 24 Mar 2025 03:10:52 +0000 (03:10 +0000)
Makefile.std
Makefile.unix
Makefile.w32
append.c
display.c
ranlib.c

index fae195ded368b15e80dd032095dd6be502c4c518..7a5b961ca61509252df879b340c482089c91bcb1 100644 (file)
@@ -9,7 +9,7 @@ LD=pdld
 LDFLAGS=-s --no-insert-timestamp
 COPTS=-S $(CFLAGS) -fno-common -ansi \
     -I. -I../pdos/pdpclib \
 LDFLAGS=-s --no-insert-timestamp
 COPTS=-S $(CFLAGS) -fno-common -ansi \
     -I. -I../pdos/pdpclib \
-    -U__MVS__ -D__MF32__ -D__PDOSGEN__ -D__NOBIVA__ \
+    -U__MVS__ -D__MF32__ -D__PDOSGEN__ -D__NOBIVA__ -D__PDOS__ \
     -I../pdos/generic -I../pdos/src $(COPT2)
 EXTRA1=--oformat mvs ../pdos/pdpclib/pgastart.o
 
     -I../pdos/generic -I../pdos/src $(COPT2)
 EXTRA1=--oformat mvs ../pdos/pdpclib/pgastart.o
 
index f4f5b5496d4c637ee338ead2808adb79f3f1cfb4..02c268cfa858e39cf6e0cbe58a7bd3df69fcb61f 100644 (file)
@@ -26,5 +26,6 @@ xar: $(CSRC)
 endif
 
 clean:
 endif
 
 clean:
+
        if [ -f xar.exe ]; then rm -rf xar.exe; fi
        if [ -f xar ]; then rm -rf xar; fi
        if [ -f xar.exe ]; then rm -rf xar.exe; fi
        if [ -f xar ]; then rm -rf xar; fi
index ad0e6506908987975ad2173d6e20861de1d726b1..9a70e98eb5b1343bba6ec87fdb361b112b8a05f4 100644 (file)
@@ -12,8 +12,10 @@ CSRC                :=  append.c ar.c conv.c delete.c display.c extract.c lib.c
 all: xar.exe
 
 clean:
 all: xar.exe
 
 clean:
+
        if exist xar.exe ( del /q xar.exe )
        if exist xar ( del /q xar )
 
 xar.exe: $(CSRC)
        if exist xar.exe ( del /q xar.exe )
        if exist xar ( del /q xar )
 
 xar.exe: $(CSRC)
+
        $(CC) $(CFLAGS) -o $@ $^
        $(CC) $(CFLAGS) -o $@ $^
index 96c625bd27eaeb7ac029259f21f27a01d11048a2..cc3f79cce57f285a6cbe829cefd6943459279b4d 100644 (file)
--- a/append.c
+++ b/append.c
@@ -11,7 +11,7 @@
 
 void append (FILE *ofp, char *fname) {
 
 
 void append (FILE *ofp, char *fname) {
 
-    unsigned char aout_magic[2];
+    /*unsigned char aout_magic[2];*/
     FILE *tfp;
     
     struct ar_header header;
     FILE *tfp;
     
     struct ar_header header;
@@ -21,7 +21,7 @@ void append (FILE *ofp, char *fname) {
     long bytes, len, read;
     
     int need_newline = 0;
     long bytes, len, read;
     
     int need_newline = 0;
-    int valid = 0;
+    /*int valid = 0;*/
     
     if ((tfp = fopen (fname, "r+b")) == NULL) {
     
     
     if ((tfp = fopen (fname, "r+b")) == NULL) {
     
@@ -30,7 +30,7 @@ void append (FILE *ofp, char *fname) {
     
     }
     
     
     }
     
-    if (fread (aout_magic, 2, 1, tfp) != 1) {
+    /*if (fread (aout_magic, 2, 1, tfp) != 1) {
     
         fclose (tfp);
         
     
         fclose (tfp);
         
@@ -48,12 +48,12 @@ void append (FILE *ofp, char *fname) {
         report_at (program_name, 0, REPORT_ERROR, "%s is not a valid a.out or coff object", fname);
         return;
     
         report_at (program_name, 0, REPORT_ERROR, "%s is not a valid a.out or coff object", fname);
         return;
     
-    }
+    }*/
     
     memset (temp, ' ', 16);
     temp[0] = '0';
     
     
     memset (temp, ' ', 16);
     temp[0] = '0';
     
-    if ((p = strrchr (fname, '/'))) {
+    if ((p = strrchr (fname, '/')) || (p = strrchr (fname, '\\'))) {
         name = (p + 1);
     }
     
         name = (p + 1);
     }
     
index 703896187337bd81319a582ee35bc4ad57b38578..3cbfd2a3cfa678bf0013a8e3c5e3525507e0d0ea 100644 (file)
--- a/display.c
+++ b/display.c
@@ -44,7 +44,7 @@ void display (void) {
         
         for (i = 16; i >= 0; --i) {
         
         
         for (i = 16; i >= 0; --i) {
         
-            if (temp[i] == 0x20) {
+            if (temp[i] == ' ') {
                 temp[i] = '\0';
             }
         
                 temp[i] = '\0';
             }
         
index 76370ecc21d701991a1ec0a44d4b093d5ba29eda..721f193bbe63c9122cba6a98cc5d8232d70396d6 100644 (file)
--- a/ranlib.c
+++ b/ranlib.c
@@ -68,6 +68,51 @@ struct coff_symbol {
 
 };
 
 
 };
 
+struct elf_exec {
+
+    unsigned char e_ident[16];
+    unsigned char e_type[2];
+    unsigned char e_machine[2];
+    unsigned char e_version[4];
+    unsigned char e_entry[4];
+    unsigned char e_phoff[4];
+    unsigned char e_shoff[4];
+    unsigned char e_flags[4];
+    unsigned char e_ehsize[2];
+    unsigned char e_phentsize[2];
+    unsigned char e_phnum[2];
+    unsigned char e_shentsize[2];
+    unsigned char e_shnum[2];
+    unsigned char e_shstrndx[2];
+
+};
+
+struct elf_shdr {
+    
+    unsigned char sh_name[4];
+    unsigned char sh_type[4];
+    unsigned char sh_flags[4];
+    unsigned char sh_addr[4];
+    unsigned char sh_offset[4];
+    unsigned char sh_size[4];
+    unsigned char sh_link[4];
+    unsigned char sh_info[4];
+    unsigned char sh_addralign[4];
+    unsigned char sh_entsize[4];
+
+};
+
+struct elf_sym {
+
+    unsigned char st_name[4];
+    unsigned char st_value[4];
+    unsigned char st_size[4];
+    unsigned char st_info[1];
+    unsigned char st_other[1];
+    unsigned char st_shndx[2];
+
+};
+
 struct strtab {
 
     const char *name;
 struct strtab {
 
     const char *name;
@@ -152,9 +197,9 @@ static void coff_get_symbols (void *object, long offset) {
 
     struct coff_exec *hdr = (struct coff_exec *) object;
     
 
     struct coff_exec *hdr = (struct coff_exec *) object;
     
-    long sym_start = GET_UINT32 (hdr->PointerToSymbolTable);
-    long sym_cnt = GET_UINT32 (hdr->NumberOfSymbols);
-    long string_table_start = sym_start + (sizeof (struct coff_symbol) * sym_cnt);
+    unsigned long sym_start = GET_UINT32 (hdr->PointerToSymbolTable);
+    unsigned long sym_cnt = GET_UINT32 (hdr->NumberOfSymbols);
+    unsigned long string_table_start = sym_start + (sizeof (struct coff_symbol) * sym_cnt);
     
     while (sym_cnt--) {
     
     
     while (sym_cnt--) {
     
@@ -215,6 +260,89 @@ static void coff_get_symbols (void *object, long offset) {
 
 }
 
 
 }
 
+#define     GET_ELF_UINT16(arr)         (endianess ? (((uint32_t) arr[0] << 8) | (((uint32_t) arr[1]))) : ((uint32_t) arr[0] | (((uint32_t) arr[1]) << 8)))
+
+#define     GET_ELF_UINT32(arr)         (endianess ? (((uint32_t) arr[0] << 24) | (((uint32_t) arr[1]) << 16) | (((uint32_t) arr[2]) << 8) | (((uint32_t) arr[3])))                 \
+    : ((uint32_t) arr[0] | (((uint32_t) arr[1]) << 8) | (((uint32_t) arr[2]) << 16) | (((uint32_t) arr[3]) << 24)))
+
+static void elf_get_symbols (void *object, long offset, int endianess) {
+
+    struct elf_exec *hdr = (struct elf_exec *) object;
+    
+    unsigned long e_shnum = GET_ELF_UINT16 (hdr->e_shnum);
+    unsigned long e_shoff = GET_ELF_UINT32 (hdr->e_shoff);
+    unsigned long e_shentsize = GET_ELF_UINT16 (hdr->e_shentsize);
+    
+    unsigned long sh_link, sh_offset, sh_entsize, sh_size;
+    unsigned long sym_strtab_size, i, j, st_name;
+    
+    struct elf_shdr strtabhdr;
+    struct elf_shdr shdr;
+    struct elf_sym elf_symbol;
+    
+    struct strtab *strtab;
+    char *sym_strtab;
+    
+    for (i = 1; i < e_shnum; i++) {
+    
+        memcpy (&shdr, (char *) object + e_shoff + i * e_shentsize, sizeof (shdr));
+        
+        if (GET_ELF_UINT32 (shdr.sh_type) != 2) {
+            continue;
+        }
+        
+        sh_link = GET_ELF_UINT32 (shdr.sh_link);
+        sh_offset = GET_ELF_UINT32 (shdr.sh_offset);
+        
+        if (sh_link == 0 || sh_link >= e_shnum) {
+            continue;
+        }
+        
+        memcpy (&strtabhdr, (char *) object + e_shoff + sh_link * e_shentsize, sizeof (strtabhdr));
+        
+        if (GET_ELF_UINT32 (strtabhdr.sh_type) != 3) {
+            continue;
+        }
+        
+        sym_strtab_size = GET_ELF_UINT32 (strtabhdr.sh_size);
+        sym_strtab = (char *) object + GET_ELF_UINT32 (strtabhdr.sh_offset);
+        
+        if ((sh_entsize = GET_ELF_UINT32 (shdr.sh_entsize)) < sizeof (elf_symbol)) {
+            continue;
+        }
+        
+        sh_size = GET_ELF_UINT32 (shdr.sh_size);
+        
+        for (j = 1; j < sh_size / sh_entsize; j++) {
+        
+            memcpy (&elf_symbol, (char *) object + sh_offset + j * sh_entsize, sizeof (elf_symbol));
+            
+            if ((st_name = GET_ELF_UINT32 (elf_symbol.st_name)) >= sym_strtab_size) {
+                continue;
+            }
+            
+            if (GET_ELF_UINT16 (elf_symbol.st_shndx) == 0 || (elf_symbol.st_info[0] >> 4) != 1) {
+                continue;
+            }
+            
+            if (sym_strtab[st_name] != '\0') {
+            
+                strtab = xmalloc (sizeof (*strtab));
+                strtab->offset = offset;
+                
+                strtab->name = xstrdup (sym_strtab + st_name);
+                strtab->length = strlen (strtab->name);
+                
+                add_strtab (&gstrtab, strtab);
+            
+            }
+        
+        }
+    
+    }
+
+}
+
 void ranlib (void) {
 
     FILE *tfp = tmpfile ();
 void ranlib (void) {
 
     FILE *tfp = tmpfile ();
@@ -227,7 +355,7 @@ void ranlib (void) {
     void *contents;
     
     char temp[16];
     void *contents;
     
     char temp[16];
-    int valid = 0;
+    /*int valid = 0;*/
     
     for (;;) {
     
     
     for (;;) {
     
@@ -270,7 +398,7 @@ void ranlib (void) {
         
         }
         
         
         }
         
-        valid = ((object[0] == 0x07 && object[1] == 0x01) || (object[0] == 0x4C && object[1] == 0x01) || (object[0] == 0x64 && object[1] == 0x86));
+        /*valid = ((object[0] == 0x07 && object[1] == 0x01) || (object[0] == 0x4C && object[1] == 0x01) || (object[0] == 0x64 && object[1] == 0x86));
         
         if (!valid) {
         
         
         if (!valid) {
         
@@ -282,18 +410,55 @@ void ranlib (void) {
             fseek (arfp, bytes, SEEK_CUR);
             continue;
         
             fseek (arfp, bytes, SEEK_CUR);
             continue;
         
-        }
+        }*/
         
         if (object[0] == 0x07 && object[1] == 0x01) {
         
         if (object[0] == 0x07 && object[1] == 0x01) {
+        
             aout_get_symbols (object, offset + 8);
             aout_get_symbols (object, offset + 8);
-        } else {
+            free (object);
+            
+            offset += sizeof (hdr);
+            offset += bytes;
+            
+            continue;
+        
+        }
+        
+        if ((object[0] == 0x4C && object[1] == 0x01) || (object[0] == 0x64 && object[1] == 0x86)) {
+        
             coff_get_symbols (object, offset + 8);
             coff_get_symbols (object, offset + 8);
+            free (object);
+            
+            offset += sizeof (hdr);
+            offset += bytes;
+            
+            continue;
+        
+        }
+        
+        if (object[0] == 0x7f && memcmp (object + 1, "ELF", 3) == 0) {
+        
+            if (object[5] == 2) {
+                elf_get_symbols (object, offset + 8, 1);
+            } else {
+                elf_get_symbols (object, offset + 8, 0);
+            }
+            
+            free (object);
+            
+            offset += sizeof (hdr);
+            offset += bytes;
+            
+            continue;
+        
         }
         
         free (object);
         
         offset += sizeof (hdr);
         offset += bytes;
         }
         
         free (object);
         
         offset += sizeof (hdr);
         offset += bytes;
+        
+        fseek (arfp, bytes, SEEK_CUR);
     
     }
     
     
     }