From 164c1de23f7c1aeec73498c6d62e450c5a31401a Mon Sep 17 00:00:00 2001 From: d0p1 Date: Mon, 10 Jun 2024 08:43:35 +0200 Subject: [PATCH] feat: readcoff --- Makefile | 7 +- tools/coff-ld.c => bin/ld/main.c | 0 bin/readcoff/main.c | 175 +++++++++++++++++++++++++++++++ docs/COFF.txt | 10 ++ docs/coding-style.txt | 1 - docs/config/Menu.txt | 10 +- tools/Makefile | 11 +- tools/coff2elf/main.c | 1 + 8 files changed, 204 insertions(+), 11 deletions(-) rename tools/coff-ld.c => bin/ld/main.c (100%) create mode 100644 bin/readcoff/main.c create mode 100644 tools/coff2elf/main.c diff --git a/Makefile b/Makefile index de18fb2..015bb53 100644 --- a/Makefile +++ b/Makefile @@ -15,9 +15,12 @@ RM = rm -f MK_BUGREPORT := \"https://git.cute.engineering/d0p1/StupidOS/issues\" MK_COMMIT := \"$(shell git rev-parse --short HEAD)\" +MK_PACKAGE := \"StupidOS\" - -CFLAGS = -DMK_COMMIT="$(MK_COMMIT)" -DMK_BUGREPORT="$(MK_BUGREPORT)" -I$(TOPDIR)include +CFLAGS = -DMK_COMMIT="$(MK_COMMIT)" \ + -DMK_BUGREPORT="$(MK_BUGREPORT)" \ + -DMK_PACKAGE="$(MK_PACKAGE)" \ + -I$(TOPDIR)include LDFLAGS = diff --git a/tools/coff-ld.c b/bin/ld/main.c similarity index 100% rename from tools/coff-ld.c rename to bin/ld/main.c diff --git a/bin/readcoff/main.c b/bin/readcoff/main.c new file mode 100644 index 0000000..7dbd247 --- /dev/null +++ b/bin/readcoff/main.c @@ -0,0 +1,175 @@ +#include +#include +#include +#include +#ifndef __stupidos__ +# include +#endif +#include + +static const struct { + int magic; + char *machine; +} MACHINES[] = { + {F_MACH_AM33, "Matsushita AM33"}, + {F_MACH_AMD64, "Intel amd64"}, + {F_MACH_ARM, "ARM"}, + {F_MACH_ARMNT, "ARM Thumb-2"}, + {F_MACH_EBC, "EFI byte code"}, + {F_MACH_I386, "Intel 80386"}, + {F_MACH_IA64, "IA64"}, + {F_MACH_M32R, "Mitsubishi M32R"}, + /* TODO */ + {F_MACH_UNKNOWN, "unknown"} +}; + +/* */ +static const char *prg_name; +static const char *mach = NULL; + +/* */ +static int display_header = 0; +static int display_program_header = 0; +static int display_sections = 0; + + +static void +usage(int retval) +{ + if (retval == EXIT_FAILURE) + { + fprintf(stderr, "Try '%s -h' for more informations.", prg_name); + } + else + { + printf("Usage: %s [OPTIONS...] [FILES]\n", prg_name); + printf("Options are:\n"); + printf("\t-a\tEquivalent to: -H -l -S -s -r -d -v -A -I\n"); + printf("\t-H\tDisplay the COFF file header\n"); + } + + exit(retval); +} + +static void +version(void) +{ + printf("%s (%s) %s", prg_name, MK_PACKAGE, MK_COMMIT); + exit(EXIT_SUCCESS); +} + +int +main(int argc, char **argv) +{ + FILHDR file_header; + AOUTHDR aout_header; + SCNHDR section_header; + char name[9]; + char *type; + FILE *fp; + int idx; + time_t timedat; + +#ifndef __stupidos__ + prg_name = basename(argv[0]); +#else + prg_name = argv[0]; +#endif + + while ((argc > 1) && (argv[1][0] == '-')) + { + switch (argv[1][1]) + { + case 'a': + display_header = 1; + display_program_header = 1; + display_sections = 1; + break; + case 'H': + display_header = 1; + break; + case 'h': + usage(EXIT_SUCCESS); + break; + case 'V': + version(); + break; + } + + argv++; + argc--; + } + + if (argc <= 1) usage(EXIT_FAILURE); + + fp = fopen(argv[1], "rb"); + if (fp == NULL) + { + return (EXIT_FAILURE); + } + + if (display_header) + { + if (fread(&file_header, 1, FILHSZ, fp) != FILHSZ) + { + return (EXIT_FAILURE); + } + + for (idx = 0; MACHINES[idx].magic != F_MACH_UNKNOWN; idx++) + { + if (MACHINES[idx].magic == file_header.f_magic) + { + mach = MACHINES[idx].machine; + break; + } + } + if (mach == NULL) return (EXIT_FAILURE); + + printf("COFF Header:\n"); + printf(" Machine: %s\n", mach); + printf(" Number of section headers: %hd\n", file_header.f_nscns); + timedat = file_header.f_timdat; + printf(" Created at: %s", ctime(&timedat)); + printf(" Start of Symbol Table: %d (bytes into file)\n", file_header.f_symptr); + printf(" Number of Symbols: %d\n", file_header.f_nsyms); + printf(" Size of optional header: %hu\n", file_header.f_opthdr); + printf(" Flags: 0x%hx\n\n", file_header.f_flags); + } + + if (display_sections) + { + fseek(fp, file_header.f_opthdr + FILHSZ, SEEK_SET); + printf("Section Headers:\n"); + printf("[Nr] Name Type Address Offset\n"); + printf(" Size\n"); + for (idx = 0; idx < file_header.f_nscns; idx++) + { + if (fread(§ion_header, 1, SCNHSZ, fp) != SCNHSZ) + { + return (EXIT_FAILURE); + } + + memset(name, 0, 9); + memcpy(name, section_header.s_name, 8); + if (section_header.s_flags & STYP_TEXT) + { + type = "TEXT"; + } else if (section_header.s_flags & STYP_DATA) + { + type = "DATA"; + } + else if (section_header.s_flags & STYP_BSS) + { + type = "BSS"; + } + else + { + type = "???"; + } + printf("[%2d] %-8s %-8s %08X %08X\n", idx, name, type, section_header.s_vaddr, section_header.s_scnptr); + printf(" %08X\n", section_header.s_size); + } + } + + return (EXIT_SUCCESS); +} diff --git a/docs/COFF.txt b/docs/COFF.txt index 01e9f52..070aef5 100644 --- a/docs/COFF.txt +++ b/docs/COFF.txt @@ -69,3 +69,13 @@ About: File Header | uint32_t | Number of entries in the symtab | | uint16_t | Optional header size | | uint16_t | Flags | + +About: Optional Header + +About: Section Header + +About: Usefull links + +- +- +- diff --git a/docs/coding-style.txt b/docs/coding-style.txt index 554c35b..3d5ffdb 100644 --- a/docs/coding-style.txt +++ b/docs/coding-style.txt @@ -6,7 +6,6 @@ The "Hungarian" notation conventions MUST be used. Comments: - TO BE ADDED About: C diff --git a/docs/config/Menu.txt b/docs/config/Menu.txt index 9298c4d..77daedd 100644 --- a/docs/config/Menu.txt +++ b/docs/config/Menu.txt @@ -20,7 +20,7 @@ Timestamp: Updated yyyy/mm/dd # These are indexes you deleted, so Natural Docs will not add them again # unless you remove them from this line. -Don't Index: Variables, Macros, Classes +Don't Index: Variables, Classes, Macros # -------------------------------------------------------------------------- @@ -48,6 +48,7 @@ Link: Source Code (https://git.cute.engineering/d0p1/StupidOS) File: Coding Style (docs/coding-style.txt) File: FAQ (docs/faq.txt) Link: StupidFS (https://stupidfs.d0p1.eu/) +File: Common Object File Format &lparen;COFF&rparen; (docs/COFF.txt) Group: BootLoader { @@ -56,11 +57,13 @@ Group: BootLoader { Group: BootSector { File: floppy.asm (boot/bootsect/floppy.asm) + File: hdd.asm (boot/bootsect/hdd.asm) } # Group: BootSector Group: Loader { File: loader.asm (boot/loader/loader.asm) + File: logger.inc (boot/loader/logger.inc) File: memory.inc (boot/loader/memory.inc) } # Group: Loader @@ -81,6 +84,7 @@ Group: BootLoader { Group: Kernel { + File: kernel memory map (kernel/intro.txt) File: kernel.asm (kernel/kernel.asm) } # Group: Kernel @@ -93,6 +97,8 @@ Group: Lib { Group: Crypto { + File: rc4.asm (no auto-title, lib/crypto/rc4/rc4.asm) + Group: chacha20 { File: chacha20.asm (lib/crypto/chacha20/chacha20.asm) @@ -110,6 +116,7 @@ Group: Lib { } # Group: Crypto + File: ctype (lib/c/ctype.asm) } # Group: Lib Group: Index { @@ -118,6 +125,5 @@ Group: Index { Constant Index: Constants File Index: Files Function Index: Functions - Property Index: Properties } # Group: Index diff --git a/tools/Makefile b/tools/Makefile index 456d8eb..8decf9b 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -1,4 +1,4 @@ -TARGET = fat$(EXEXT) coff-ld$(EXEXT) parted$(EXEXT) mkfs.stpd$(EXEXT) +TARGET = fat$(EXEXT) coff-ld$(EXEXT) parted$(EXEXT) mkfs.stpd$(EXEXT) readcoff$(EXEXT) .PHONY: all all: $(TARGET) @@ -6,15 +6,14 @@ all: $(TARGET) fat$(EXEXT): fat.c $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) -coff-ld$(EXEXT): coff-ld.c +coff-ld$(EXEXT): ../bin/ld/main.c + $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) + +readcoff$(EXEXT): ../bin/readcoff/main.c $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) parted$(EXEXT): ../sbin/parted/main.c -ifneq (,$(findstring cl,$(CC))) - $(CC) /Fo:$@ $^ $(CFLAGS) $(LDFLAGS) -else $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) -endif mkfs.stpd$(EXEXT): ../sbin/mkfs.stpd/main.c $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) diff --git a/tools/coff2elf/main.c b/tools/coff2elf/main.c new file mode 100644 index 0000000..43c0c50 --- /dev/null +++ b/tools/coff2elf/main.c @@ -0,0 +1 @@ +#include