From c7a92d3104807f2831b706642adbd3492e440ac3 Mon Sep 17 00:00:00 2001 From: Rangi Date: Sat, 27 Aug 2022 14:02:03 -0400 Subject: [PATCH] `rgblink -M` omits symbol names from .map file --- contrib/bash_compl/_rgblink.bash | 1 + contrib/zsh_compl/_rgblink | 1 + include/link/main.h | 1 + man/rgblink.1 | 4 +++- src/link/main.c | 9 +++++++-- src/link/output.c | 21 +++++++++++++-------- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/contrib/bash_compl/_rgblink.bash b/contrib/bash_compl/_rgblink.bash index 28eeb96b..ec9446d5 100755 --- a/contrib/bash_compl/_rgblink.bash +++ b/contrib/bash_compl/_rgblink.bash @@ -14,6 +14,7 @@ _rgblink_completions() { [w]="wramx:normal" [x]="nopad:normal" [l]="linkerscript:glob-*" + [M]="no-sym-in-map:normal" [m]="map:glob-*.map" [n]="sym:glob-*.sym" [O]="overlay:glob-*.gb *.gbc *.sgb" diff --git a/contrib/zsh_compl/_rgblink b/contrib/zsh_compl/_rgblink index 53e69a36..35f30a17 100644 --- a/contrib/zsh_compl/_rgblink +++ b/contrib/zsh_compl/_rgblink @@ -11,6 +11,7 @@ local args=( '(-x --nopad)'{-x,--nopad}'[Disable padding the end of the final file]' '(-l --linkerscript)'{-l,--linkerscript}"+[Use a linker script]:linker script:_files -g '*.link'" + '(-M --no-sym-in-map)'{-M,--no-sym-in-map}'[Do not output symbol names in map file]' '(-m --map)'{-m,--map}"+[Produce a map file]:map file:_files -g '*.map'" '(-n --sym)'(-n,--sym)"+[Produce a symbol file]:sym file:_files -g '*.sym'" '(-O --overlay)'{-O,--overlay}'+[Overlay sections over on top of bin file]:base overlay:_files' diff --git a/include/link/main.h b/include/link/main.h index a9f2f429..387f3078 100644 --- a/include/link/main.h +++ b/include/link/main.h @@ -20,6 +20,7 @@ extern bool isDmgMode; extern char *linkerScriptName; extern char const *mapFileName; +extern bool noSymInMap; extern char const *symFileName; extern char const *overlayFileName; extern char const *outputFileName; diff --git a/man/rgblink.1 b/man/rgblink.1 index c47a9aea..eefe29e0 100644 --- a/man/rgblink.1 +++ b/man/rgblink.1 @@ -13,7 +13,7 @@ .Nd Game Boy linker .Sh SYNOPSIS .Nm -.Op Fl dtVvwx +.Op Fl dMtVvwx .Op Fl l Ar linker_script .Op Fl m Ar map_file .Op Fl n Ar sym_file @@ -73,6 +73,8 @@ The attributes assigned in the linker script must be consistent with any assigne See .Xr rgblink 5 for more information about the linker script format. +.It Fl M , Fl Fl no-sym-in-map +If specified, the map file will not list symbols, only sections. .It Fl m Ar map_file , Fl Fl map Ar map_file Write a map file to the given filename, listing how sections and symbols were assigned. .It Fl n Ar sym_file , Fl Fl sym Ar sym_file diff --git a/src/link/main.c b/src/link/main.c index 52485185..99c4a355 100644 --- a/src/link/main.c +++ b/src/link/main.c @@ -36,6 +36,7 @@ bool isDmgMode; /* -d */ char *linkerScriptName; /* -l */ char const *mapFileName; /* -m */ +bool noSymInMap; /* -M */ char const *symFileName; /* -n */ char const *overlayFileName; /* -O */ char const *outputFileName; /* -o */ @@ -165,7 +166,7 @@ FILE *openFile(char const *fileName, char const *mode) } /* Short options */ -static const char *optstring = "dl:m:n:O:o:p:S:s:tVvWwx"; +static const char *optstring = "dl:m:Mn:O:o:p:S:s:tVvWwx"; /* * Equivalent long options @@ -181,6 +182,7 @@ static struct option const longopts[] = { { "dmg", no_argument, NULL, 'd' }, { "linkerscript", required_argument, NULL, 'l' }, { "map", required_argument, NULL, 'm' }, + { "no-sym-in-map", no_argument, NULL, 'M' }, { "sym", required_argument, NULL, 'n' }, { "overlay", required_argument, NULL, 'O' }, { "output", required_argument, NULL, 'o' }, @@ -201,7 +203,7 @@ static struct option const longopts[] = { static void printUsage(void) { fputs( -"Usage: rgblink [-dtVvwx] [-l script] [-m map_file] [-n sym_file]\n" +"Usage: rgblink [-dMtVvwx] [-l script] [-m map_file] [-n sym_file]\n" " [-O overlay_file] [-o out_file] [-p pad_value]\n" " [-S spec] [-s symbol] ...\n" "Useful options:\n" @@ -374,6 +376,9 @@ int main(int argc, char *argv[]) case 'l': linkerScriptName = musl_optarg; break; + case 'M': + noSymInMap = true; + break; case 'm': mapFileName = musl_optarg; break; diff --git a/src/link/output.c b/src/link/output.c index 1fcbf0ee..aa720338 100644 --- a/src/link/output.c +++ b/src/link/output.c @@ -394,16 +394,21 @@ static uint16_t writeMapBank(struct SortedSections const *sectList, fprintf(mapFile, " SECTION: $%04" PRIx16 " (0 bytes) [\"%s\"]\n", sect->org, sect->name); - uint16_t org = sect->org; + if (!noSymInMap) { + uint16_t org = sect->org; - while (sect) { - fprintf(mapFile, " ; New %s\n", sect->modifier == SECTION_FRAGMENT ? "fragment": "union"); - for (size_t i = 0; i < sect->nbSymbols; i++) - fprintf(mapFile, " $%04" PRIx32 " = %s\n", - sect->symbols[i]->offset + org, - sect->symbols[i]->name); + while (sect) { + if (sect->modifier == SECTION_UNION) + fprintf(mapFile, " ; New union\n"); + else if (sect->modifier == SECTION_FRAGMENT) + fprintf(mapFile, " ; New fragment\n"); + for (size_t i = 0; i < sect->nbSymbols; i++) + fprintf(mapFile, " $%04" PRIx32 " = %s\n", + sect->symbols[i]->offset + org, + sect->symbols[i]->name); - sect = sect->nextu; // Also print symbols in the following "pieces" + sect = sect->nextu; // Also print symbols in the following "pieces" + } } *pickedSection = (*pickedSection)->next;