scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 5b882ab2a1e8a571c724614a7a6527549f598be5
parent 61b7b7dbc0a74fae3e23b78cd7d61ced9922927b
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sun, 19 Jan 2025 12:13:55 +0100

objdump: Add the -s flag

This flag dumps the hexadecimal and character representation
of the content of a section.

Diffstat:
Msrc/cmd/scc-objdump/main.c | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 67 insertions(+), 4 deletions(-)

diff --git a/src/cmd/scc-objdump/main.c b/src/cmd/scc-objdump/main.c @@ -1,4 +1,6 @@ +#include <ctype.h> #include <errno.h> +#include <limits.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -12,7 +14,7 @@ #include "objdump.h" -int tflag, fflag, hflag, pflag, aflag, rflag; +int tflag, fflag, hflag, pflag, aflag, rflag, sflag; char *argv0; static int status, nsecs; @@ -197,6 +199,61 @@ dumpscns(Obj *obj) } static void +dumpdata(Obj *obj, FILE *fp) +{ + int i, j, c; + char buf[19]; + Section sec; + unsigned long long n; + + buf[0] = '|'; + buf[17] = '|'; + buf[18] = '\0'; + + for (i = 0; getsec(obj, &i, &sec); i++) { + if (!selected(sec.name)) + continue; + if ((sec.flags & SALLOC) == 0 || sec.size == 0) + continue; + + printf("Contents of section %s\n", sec.name); + + if (!objpos(obj, fp, sec.offset)) + goto errno_error; + + for (n = 0; n < sec.size; ) { + memset(buf+1, '.', 16); + printf(" %04llx ", sec.base + n); + for (j = 0; j < 16 && n < sec.size; j++, n++) { + if ((c = getc(fp)) == EOF) { + if (ferror(fp)) + goto errno_error; + error("section %s: end of file found before end of section", + sec.name); + goto next_section; + } + + if (c < CHAR_MAX && c > 0 && isprint(c)) + buf[j] = c; + + printf("%02x ", (unsigned) c & 0xFF); + } + + for ( ; j < 16; j++) + fputs(" ", stdout); + puts(buf); + } + +next_section: + continue; + +errno_error: + error("section %s: %s", sec.name, strerror(errno)); + } +} + + +static void dumpsyms(Obj *obj) { puts("SYMBOL TABLE:"); @@ -233,6 +290,8 @@ dumpobj(FILE *fp, int type, char *fmt) dumpfhdr(obj, fmt); if (hflag) dumpscns(obj); + if (sflag) + dumpdata(obj, fp); if (tflag) dumpsyms(obj); @@ -336,7 +395,7 @@ objdump(char *fname) static void usage(void) { - fputs("usage: objdump [-afhpt][-j section] file...\n", stderr); + fputs("usage: objdump [-afhpts][-j section] file...\n", stderr); exit(EXIT_FAILURE); } @@ -358,6 +417,9 @@ main(int argc, char *argv[]) case 'p': pflag = 1; break; + case 's': + sflag = 1; + break; case 't': tflag = 1; break; @@ -370,8 +432,9 @@ main(int argc, char *argv[]) usage(); } ARGEND - if (!aflag && !fflag && !hflag && !tflag) { - fputs("objdump: At lest one of [afht] flags must be used\n", + if (!aflag && !fflag && !hflag + && !tflag && !sflag) { + fputs("objdump: At lest one of [afhts] flags must be used\n", stderr); usage(); }