The Sega Saturn SDK comes with pre-build static libraries such as
SEGA_GFS which are required to interact with the Saturn hardware and provides a nice extraction layer .
There are two standard GNU (.a) and Hitachi (.lib). The Sega Saturn libraries contain compiled versions for both standards.
The tricky part is creating signature files for IDA Pro as the standard
pelf tools from IDA Pro don’t work.
You will notice for example that running
LIBSGL.A will give the following output:
./pelf LIBSGL.A LIBSGL.A: skipped 289, total 289
pcf on the same library provides:
LIBSGL.A: skipped 0, total 0 (SKIPPED ALL MODULES!)
What is interesting is that if you extract the .a file and run
pcf on the extracting *.o files it works and create a .pat file.
My guess is that since the .o files are in COFF format PELF can’t understand them, which makes sense. So PCF should have worked right? I presume its due to COFF files normally being in a different library format (.lib) and so it doesn’t support GNU
.a archives of COFF code.
So we need to write a script which extract the archive, runs
pcf on all the extracting .o files and then concatinates all the .pat files into a single file.
Here is a script we wrote for exactly this purpose, note that you will need
sigmake executables from the IDA Pro installation for your platform.
import os import fnmatch import subprocess patfiles= def execute_command(bashCommand): print bashCommand return subprocess.check_output(bashCommand.split(),stderr= subprocess.STDOUT) def extract_library(libraryName, libraryFileName): execute_command("rm -rf ./"+libraryName) execute_command("mkdir -p "+libraryName) try: execute_command("tar -C./"+libraryName+" -xvf ./"+libraryFileName) except: pass def loopThroughExtarctedOFiles(libraryName, filename): for root, dirnames, filenames in os.walk('./'+libraryName): for filename in fnmatch.filter(filenames, '*.[oO]'): print filename execute_command("./pcf ./"+libraryName+"/"+filename) patfileName = filename.replace(".o",".pat").replace(".O",".pat") patfiles.append("./"+libraryName+"/"+patfileName) for root, dirnames, filenames in os.walk('.'): for filename in fnmatch.filter(filenames, '*.[aA]'): libraryName = filename.replace('.a','').replace('.A','') extract_library(libraryName, filename) loopThroughExtarctedOFiles(libraryName, filename) print filename print patfiles execute_command("rm -f *.sig") execute_command("./sigmake -nSegaSaturn "+'+'.join(patfiles)+" "+'SegaSaturn.sig')
The Sega SDK comes with pre-build Hitachi library files (*.lib) for use with the Hitachi SH2 toolchain.
You can obtain the Hitachi Librarian online from an old Dreamcast SDK. The Hitachi Librarian is for building and extracting static libraries, which are just a bunch of compressed object code (.obj files are assembled but not linked machine language).
You use the librarien tool (
lbr.exe) from the command line like so:
For example to list the object modules in
SEGA_GFS.LIB on windows:
lbr.exe SEGA_GFS.LIB /LIST
Similar to Makefiles the Hitachi Librarian supports a file to tell it how to build a library from a bunch of compiled object (.obj) files.
Currently it is unknown how to create IDA Pro Signatures from the Hitachi versions of the libraries.
But here are a few hints to see if you can help solve the problem. First lets use the librarian to extract the specific module files like so:
lbr.exe SEGA_GFS.LIB /EXTRACT=gfs /OUTPUT=gfs
The problem is the resulting extraction is also a library file format so it cannot be passed to
pcf to create signatures.
Is it possible to get standard COFF object files from the hitachi libraries?
Note that although these library files also have the extension
.lib they are not compatible with the Hitachi libraries listed above.
Example to list the contents of a PsyQ static library:
PSYLIB.EXE /l LIBSN.LIB
To extract the object files:
PSYLIB.EXE /x LIBSN.LIB
The extracted .OBJ files cannot be understood by the standard
pcf but IDA Pro comes with
ppsx which does support the PSYQ library file type.
The only problem is that when you run it it will complain about the saturn processor as it is only developed for the PSX MIPS based processor:
Fatal [CD.OBJ] (CD.OBJ): Unknown processor type 8