Aunque es un poco largo, dejo por aquí una guía de como internamente se compila el código usando el SDK de PSL1GHT y los pasos que se van haciendo desde el código fuente base hasta tener un .elf, .self y .pkg preparados. No es más que seguir los pasos del makefile pero de manera un poco más legible para que se pueda entender de forma rápida.
Pongo como ejemplo el sputest de los samples de PSL1GHT. En los spoiler están los comandos que se ejecutan con todos los parámetros.
FASE 1 - Compilación de código para SPU -> samples/sputest/spu1.1 - Generación de main.o en base a main.c usando spu-gcc
spu-gcc -MMD -MP -MF /ps3/psl1ght/PSL1GHT/samples/sputest/spu/build/main.d -g -O2 -Wall --std=gnu99 -I/ps3/psl1ght/PSL1GHT/samples/sputest/spu/include -I/ps3/psl1ght/PSL1GHT/samples/sputest/spu/build -c /ps3/psl1ght/PSL1GHT/samples/sputest/spu/source/main.c -o main.o
1.2 - Generación de spu.elf en base a main.o usando spu-gcc como linker
spu-gcc main.o -o /ps3/psl1ght/PSL1GHT/samples/sputest/spu/spu.elf
1.3 - Copia del spu.elf generado en la carpeta build con el nombre spu.bin
cp /ps3/psl1ght/PSL1GHT/samples/sputest/spu/spu.elf /ps3/psl1ght/PSL1GHT/samples/sputest/build/spu.bin
Aquí ya tenemos el código SPU preparado. Pasamos al siguiente paso que es el código para PPU y la generación del elf/self.
FASE 2 - Compilación de código para PPU -> samples/sputest/build2.1 - Generación de spu.bin.h y spu.bin.S en base al spu.bin usando la herramienta raw2h
/ps3/psl1ght/build/bin/raw2h /ps3/psl1ght/PSL1GHT/samples/sputest/data/spu.bin /ps3/psl1ght/PSL1GHT/samples/sputest/build/spu.bin.h /ps3/psl1ght/PSL1GHT/samples/sputest/build/spu.bin.S spu_bin
Los parámetros son 3:
<raw> : sputest/data/spu.bin
<c header> : sputest/build/spu.bin.h
<asm file> : sputest/build/spu.bin.S
<array name> : spu_bin
2.2 - Generación de spu.bin.o en base a spu.bin.S (Ensamblador)
ppu-gcc -x assembler-with-cpp -c /ps3/psl1ght/PSL1GHT/samples/sputest/build/spu.bin.S -o /ps3/psl1ght/PSL1GHT/samples/sputest/build/spu.bin.o
2.3 - Generación de main.o en base a main.c
ppu-gcc -MMD -MP -MF /ps3/psl1ght/PSL1GHT/samples/sputest/build/main.d -g -I/ps3/psl1ght/build/include -I/ps3/ps3toolchain/build/ppu/include -g -O2 -Wall --std=gnu99 -I/ps3/psl1ght/PSL1GHT/samples/sputest/include -I/ps3/psl1ght/PSL1GHT/samples/sputest/build -c /ps3/psl1ght/PSL1GHT/samples/sputest/source/main.c -o main.o
2.4 - Generación de sputest.elf en base a los dos .o, el de PPU (main.o) y el de SPU (spu.bin.o)
ppu-gcc main.o spu.bin.o -T /ps3/psl1ght/build/lib/linker.x -B/ps3/psl1ght/build/lib -B/ps3/ps3toolchain/build/ppu/lib -o /ps3/psl1ght/PSL1GHT/samples/sputest/sputest.elf
2.5 - Stripe del sputest.elf
ppu-strip /ps3/psl1ght/PSL1GHT/samples/sputest/sputest.elf -o /ps3/psl1ght/PSL1GHT/samples/sputest/build/sputest.elf
2.6 - Sprxlinker del sputest.elf
/ps3/psl1ght/build/bin/sprxlinker /ps3/psl1ght/PSL1GHT/samples/sputest/build/sputest.elf
2.7 - Creación del sputest.self en base al sputest.elf
/ps3/psl1ght/build/bin/fself.py /ps3/psl1ght/PSL1GHT/samples/sputest/build/sputest.elf /ps3/psl1ght/PSL1GHT/samples/sputest/sputest.self
Al terminar esta fase ya tenemos el .elf y el .self al completo. Sólo nos falta en el caso que queramos, el crear un .pkg.
FASE 3 - Creación del paquete .pkg3.1 - Crear directorio build/pkg y dentro el USRDIR
mkdir -p build/pkg/USRDIR
3.2 - Copiar el icono predefinido al directorio del paquete
cp /ps3/psl1ght/build/bin/ICON0.PNG build/pkg/
3.3 - Crear el EBOOT.BIN con la utilidad fself.py en formato npdrm para .PKG
/ps3/psl1ght/build/bin/fself.py -n build/sputest.elf build/pkg/USRDIR/EBOOT.BIN
3.4 - Crear el PARAM.SFO basado en el template /ps3/psl1ght/build/bin/sfo.xml y los parámetros correspondientes
/ps3/psl1ght/build/bin/sfo.py --title Template - PSL1GHT --appid TEST00003 -f /ps3/psl1ght/build/bin/sfo.xml build/pkg/PARAM.SFO
3.5 - Crear el.pkg propiamente con la estructura de build/pkg y los parámetros correspondientes
/ps3/psl1ght/build/bin/pkg.py --contentid UP0001-TEST00003_00-0000000000000000 build/pkg/ /ps3/psl1ght/PSL1GHT/samples/sputest/sputest.pkg
De esta manera ya tendremos el .elf, .self y el .pkg listos para instalar.
Espero haber aclarado un poco más las herramientas utilizadas y el proceso de creación, si véis que hay algún error o alguna puntualización por favor comentádmelo y lo cambio/aclaro.
Supongo que en algún momento se podrá supongo utilizar en vez del fself.py el makeself con las claves del firmware que queramos para firmarlo de forma original.
Saludos,