feat(bin/readcoff): display symtab

This commit is contained in:
d0p1 🏳️‍⚧️ 2024-06-10 10:05:10 +02:00
parent 164c1de23f
commit a12220d492
4 changed files with 183 additions and 26 deletions

View file

@ -5,11 +5,13 @@
static char *prg_name; static char *prg_name;
static char *outfile = "a.out"; static char *outfile = "a.out";
typedef struct section typedef struct {
{
} Section; } Section;
typedef struct {
} Object;
static void static void
usage(int retcode) usage(int retcode)
@ -45,7 +47,7 @@ main(int argc, char **argv)
FILHDR fhdr; FILHDR fhdr;
SCNHDR shdr; SCNHDR shdr;
uint8_t *buffer; uint8_t *buffer;
SYM entry; SYMENT entry;
RELOC reloc; RELOC reloc;
int idx; int idx;
@ -108,7 +110,7 @@ main(int argc, char **argv)
for (idx = 0; idx < fhdr.f_nsyms; idx++) for (idx = 0; idx < fhdr.f_nsyms; idx++)
{ {
fread(&entry, 1, SYMSZ, fp); fread(&entry, 1, SYMESZ, fp);
printf("name: %c%c%c%c%c%c%c%c\n", entry.n_name[0], entry.n_name[1],entry.n_name[2],entry.n_name[3],entry.n_name[4],entry.n_name[5],entry.n_name[6],entry.n_name[7]); printf("name: %c%c%c%c%c%c%c%c\n", entry.n_name[0], entry.n_name[1],entry.n_name[2],entry.n_name[3],entry.n_name[4],entry.n_name[5],entry.n_name[6],entry.n_name[7]);
printf("\tvalue: %d\n", entry.n_value); printf("\tvalue: %d\n", entry.n_value);
printf("\tscnum: %hd\n", entry.n_scnum); printf("\tscnum: %hd\n", entry.n_scnum);

View file

@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include <string.h> #include <string.h>
#include <assert.h>
#ifndef __stupidos__ #ifndef __stupidos__
# include <libgen.h> # include <libgen.h>
#endif #endif
@ -29,9 +30,9 @@ static const char *mach = NULL;
/* */ /* */
static int display_header = 0; static int display_header = 0;
static int display_program_header = 0; static int display_optional_header = 0;
static int display_sections = 0; static int display_sections = 0;
static int display_symbol_table = 0;
static void static void
usage(int retval) usage(int retval)
@ -64,6 +65,7 @@ main(int argc, char **argv)
FILHDR file_header; FILHDR file_header;
AOUTHDR aout_header; AOUTHDR aout_header;
SCNHDR section_header; SCNHDR section_header;
SYMENT sym_entry;
char name[9]; char name[9];
char *type; char *type;
FILE *fp; FILE *fp;
@ -82,7 +84,8 @@ main(int argc, char **argv)
{ {
case 'a': case 'a':
display_header = 1; display_header = 1;
display_program_header = 1; display_optional_header = 1;
display_symbol_table = 1;
display_sections = 1; display_sections = 1;
break; break;
case 'H': case 'H':
@ -169,6 +172,23 @@ main(int argc, char **argv)
printf("[%2d] %-8s %-8s %08X %08X\n", idx, name, type, section_header.s_vaddr, section_header.s_scnptr); 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); printf(" %08X\n", section_header.s_size);
} }
printf("\n");
}
if (display_symbol_table)
{
printf("Symbol table contains %d entries:\n", file_header.f_nsyms);
printf(" Num: Value Type Name\n");
assert(sizeof(SYMENT) == SYMESZ);
for (idx = 0; idx <= file_header.f_nsyms; idx++)
{
fseek(fp, file_header.f_symptr + (SYMESZ * idx), SEEK_SET);
fread(&sym_entry, 1, SYMESZ, fp);
memset(name, 0, 9);
memcpy(name, sym_entry.n_name, 8);
printf(" %d: %08x %hd %s\n", idx, sym_entry.n_value, sym_entry.n_type, name);
}
} }
return (EXIT_SUCCESS); return (EXIT_SUCCESS);

View file

@ -79,3 +79,4 @@ About: Usefull links
- <https://wiki.osdev.org/COFF> - <https://wiki.osdev.org/COFF>
- <http://www.delorie.com/djgpp/doc/coff/filhdr.html> - <http://www.delorie.com/djgpp/doc/coff/filhdr.html>
- <Official Microsoft COFF Specification (2016) at https://web.archive.org/web/20230703150217/https%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F9%2Fc%2F5%2F9c5b2167-8017-4bae-9fde-d599bac8184a%2Fpecoff_v83.docx> - <Official Microsoft COFF Specification (2016) at https://web.archive.org/web/20230703150217/https%3A%2F%2Fdownload.microsoft.com%2Fdownload%2F9%2Fc%2F5%2F9c5b2167-8017-4bae-9fde-d599bac8184a%2Fpecoff_v83.docx>
- <UNIX System V/386 Release 3.2 Programmer's Guide, Volume II at http://bitsavers.org/pdf/att/unix/System_V_386_Release_3.2/UNIX_System_V_386_Release_3.2_Programmers_Guide_Vol2_1989.pdf>

View file

@ -16,7 +16,30 @@ typedef struct filehdr
# define FILHSZ sizeof(FILHDR) # define FILHSZ sizeof(FILHDR)
# define F_MACH_I386 0x014c # define F_MACH_UNKNOWN 0x0
# define F_MACH_AM33 0x1d3
# define F_MACH_AMD64 0x8664
# define F_MACH_ARM 0x1c0
# define F_MACH_ARMNT 0x1c4
# define F_MACH_EBC 0xebc
# define F_MACH_I386 0x14c
# define F_MACH_IA64 0x200
# define F_MACH_M32R 0x9041
# define F_MACH_MIPS16 0x266
# define F_MACH_MIPSFPU 0x366
# define F_MACH_MIPSFPU16 0x466
# define F_MACH_POWERPC 0x1f0
# define F_MACH_POWERPCFP 0x1f1
# define F_MACH_R4000 0x166
# define F_MACH_RISCV32 0x5032
# define F_MACH_RISCV64 0x5064
# define F_MACH_RISCV128 0x5128
# define F_MACH_SH3 0x1a2
# define F_MACH_SH3DSP 0x1a3
# define F_MACH_SH4 0x1a6
# define F_MACH_SH5 0x1a8
# define F_MACH_THUMB 0x1c2
# define F_MACH_WCEMIPSV2 0x169
# define F_RELFLG 0x0001 # define F_RELFLG 0x0001
# define F_EXEC 0x0002 # define F_EXEC 0x0002
@ -82,11 +105,12 @@ typedef struct reloc
} __attribute__((packed)) RELOC; } __attribute__((packed)) RELOC;
# define RELSZ 10 # define RELSZ 10
# define R_ABS 0x000 # define R_ABS 0
# define R_DIR16 0x001 # define R_DIR16 01
# define R_REL16 0x002 # define R_REL16 02
# define R_DIR32 0x006 # define R_DIR32 06
# define R_PCRLONG 0x024 # define R_SEG12 011
# define R_PCRLONG 024
typedef struct lineno typedef struct lineno
{ {
@ -99,22 +123,132 @@ typedef struct lineno
} __attribute__((packed)) LINENO; } __attribute__((packed)) LINENO;
# define LINESZ 6 # define LINESZ 6
typedef struct sym
{
uint8_t n_name[8];
int32_t n_value;
int16_t n_scnum;
uint16_t n_type;
uint8_t n_sclass;
uint8_t n_numaux;
} __attribute__((packed)) SYM;
# define SYMSZ 18
# define N_UNDEF (0x0) # define N_UNDEF (0x0)
# define N_ABS (-0x1) # define N_ABS (-0x1)
# define N_DEBUG (-0x2) # define N_DEBUG (-0x2)
# define C_EXT 0x2 # define C_EFCN -1 /* physical end of a function */
# define C_STAT 0x3 # define C_NULL 0
# define C_AUTO 1
# define C_EXT 2 /* external symbol */
# define C_STAT 3 /* static */
# define C_REG 4 /* register var */
# define C_EXTDEF 5 /* external definition */
# define C_LABEL 6
# define C_ULABEL 7 /* undefined label */
# define C_MOS 8 /* member of struct */
# define C_ARG 9
# define C_STRTAG 10 /* struct tag */
# define C_MOU 11 /* member of union */
# define C_UNTAG 12 /* union tag */
# define C_TPDEF 13 /* typedef */
# define C_USTATIC 14
# define C_ENTAG 15
# define C_MOE 16
# define C_REGPARM 17
# define C_FIELD 18
# define C_BLOCK 100
# define C_FCN 101
# define C_EOS 102
# define C_FILE 103
# define C_LINE 104
# define C_ALIAS 105
# define C_HIDDEN 106
# define T_NULL 0
# define T_ARG 1
# define T_CHAR 2
# define T_SHORT 3
# define T_INT 4
# define T_LONG 5
# define T_FLOAT 6
# define T_DOUBLE 7
# define T_STRUCT 8
# define T_UNION 9
# define T_ENUM 10
# define T_MOE 11
# define T_UCHAR 12
# define T_USHORT 13
# define T_UINT 14
# define T_ULONG 15
# define DT_NON 0
# define DT_PTR 1
# define DT_FCN 2
# define DT_ARY 3
typedef struct syment
{
union
{
char _n_name[8]; /* symbol name */
struct
{
int32_t _n_zeroes; /* symbol name */
int32_t _n_offset; /* loc in str table */
} _n_n;
uint32_t _n_nptr[2];
} _n;
uint32_t n_value;
int16_t n_scnum;
uint16_t n_type;
int8_t n_sclass;
int8_t n_numaux;
} __attribute__((packed)) SYMENT;
# define SYMESZ 18
# define n_name _n._n_name
# define n_zeroes _n._n_n._n_zeroes
# define n_offset _n._n_n._n_offset
# define n_nptr _n._n_nptr[1]
typedef union auxent
{
struct
{
int32_t x_tagndx;
union
{
struct
{
uint16_t x_lnno;
uint16_t x_size;
} x_lnsz;
int32_t x_fsize;
} x_misc;
union
{
struct
{
int32_t x_lnnoptr;
int32_t x_endndx;
} x_fcn;
struct
{
uint16_t x_dimen[4];
} x_ary;
} x_fcnary;
uint16_t x_tvndx;
} x_sym;
struct
{
char x_fname[14];
} x_file;
struct
{
int32_t x_scnlen;
uint16_t x_nreloc;
uint16_t x_nlinno;
} x_scn;
struct
{
int32_t x_tvfill;
uint16_t x_tvlen;
uint16_t x_tvran[2];
} x_tv;
} AUXENT;
# define AUXESZ 18
#endif /* !COFF_H */ #endif /* !COFF_H */