1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-14 21:40:03 +00:00

fix_bss.py: Subtract addend for relocations against global symbols (#2169)

This commit is contained in:
cadmic 2024-09-08 08:13:24 -07:00 committed by GitHub
parent 2d96f001db
commit c39323a336
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -152,7 +152,19 @@ def get_file_pointers(
else:
assert False, "Invalid relocation"
pointers.append(Pointer(reloc.name, reloc.addend, base_value, build_value))
# For relocations against a global symbol, subtract the addend so that the pointer
# is for the start of the symbol. This can help deal with things like STACK_TOP
# (where the pointer is past the end of the symbol) or negative addends. If the
# relocation is against a section however, it's not useful to subtract the addend,
# so we keep it as-is and hope for the best.
if reloc.name.startswith("."): # section
addend = reloc.addend
else: # symbol
addend = 0
base_value -= reloc.addend
build_value -= reloc.addend
pointers.append(Pointer(reloc.name, addend, base_value, build_value))
return pointers
@ -774,14 +786,8 @@ def main():
for file, bss_section in bss_sections.items():
if not bss_section.pointers:
continue
# The following heuristic doesn't work for z_locale, since the first pointer into BSS is not
# at the start of the section. Fortunately z_locale either has one BSS variable (in GC versions)
# or none (in N64 versions), so we can just skip it.
if str(file) == "src/boot/z_locale.c":
continue
# For the baserom, assume that the lowest address is the start of the BSS section. This might
# not be true if the first BSS variable is not referenced, but in practice this doesn't happen
# (except for z_locale above).
# not be true if the first BSS variable is not referenced, but in practice this doesn't happen.
base_min_address = min(p.base_value for p in bss_section.pointers)
build_min_address = bss_section.start_address
if not all(
@ -798,7 +804,8 @@ def main():
print("No BSS reordering found.")
if args.files:
files_to_fix = args.files
# Ignore files that don't have a BSS section in the ROM
files_to_fix = [file for file in args.files if file in bss_sections]
else:
files_to_fix = files_with_reordering
if not files_to_fix: