Ps2toolchain: ELF ํŒŒ์ผ์˜ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๊ฐ€ ๋•Œ๋•Œ๋กœ ์†์ƒ๋จ

์— ๋งŒ๋“  2020๋…„ 01์›” 15์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ps2dev/ps2toolchain

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ž˜๋ชป๋œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

#include <stdio.h>

extern const int i1, i2, i3, i4;

int main()
{
        printf("i1=%d\n", i1);
        printf("i2=%d\n", i2);
        printf("i3=%d\n", i3);
        printf("i4=%d\n", i4);

        return 0;
}

const int dum1=1;
const int dum2=2;
const int dum3=3;
//const int dum4=4;
//const int dum5=5;
//const int dum6=6;
const int i1=1111;
const int i2=2222;
const int i3=3333;
const int i4=4444;

์ž„์˜์˜ ์ˆ˜์˜ ๋”๋ฏธ ์ƒ์ˆ˜๋กœ ์‹œ๋„ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
์ข‹์€:

i1=1111
i2=2222
i3=3333
i4=4444

๋‚˜์œ:

i1=1111
i2=2222
i3=3333
i4=0
i1=1111
i2=2222
i3=0
i4=0



md5-a7a998816ff6355b19ebaf6bb16f20b1



i1=1111
i2=0
i3=0
i4=0



md5-50fa41c3352404f2cadd42c17104c34f



ee-gcc -o hello.elf hello.c
ps2client -h 192.168.1.10 execee host:hello.elf

์ด ๋ฒ„๊ทธ๋กœ ์ธํ•ด OPL์˜ size_ds34bt_irx ๋ฐ/๋˜๋Š” size_ds34usb_irx๊ฐ€ 0์ด ๋ฉ๋‹ˆ๋‹ค. ๋ถ€ํŒ… ์‹œ OPL์ด ๋ฌด์ž‘์œ„๋กœ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค(๊ฒ€์€ ํ™”๋ฉด). OPL์—์„œ ์ž„์˜์˜ ์œ„์น˜์— ์ฝ”๋“œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด ๋ฒ„๊ทธ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ ๋•Œ ์ž˜๋ชป๋œ ๊ฐ’์€ ELF ํŒŒ์ผ์˜ ๋งˆ์ง€๋ง‰ 128๋น„ํŠธ์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ee-objdump -D hello.elf

elf ํŒŒ์ผ์˜ ๊ฐ’์ด ์ข‹์•„์„œ elf ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ค‘ ์–ด๋”˜๊ฐ€์—์„œ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ฒ„๊ทธ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

crt0์€ 16๋ฐ”์ดํŠธ/128๋น„ํŠธ ๋‹จ์œ„๋กœ .bss ์„น์…˜์„ ์ง€์›๋‹ˆ๋‹ค. .bss ์„น์…˜์ด ์ตœ์†Œ 16๋ฐ”์ดํŠธ/128๋น„ํŠธ๋กœ ์ •๋ ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ps2sdk์˜ ๋ง์ปค ํŒŒ์ผ์— ์˜ํ•ด ๋ณด์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ binutils์˜ ๊ธฐ๋ณธ ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ(์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/ps2dev/ps2toolchain/commit/7c494f217d379639aaca23d3c588e48986177a51)๋Š” crt0์— ๋Œ€ํ•ด .bss ์„น์…˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .sdata์˜ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ ๊ฐ’๋„ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์—์„œ ๋‚ด์žฅ binutils ๋ง์ปค์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. newlib PR์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  9 ๋Œ“๊ธ€

์–ด๋–ป๊ฒŒ ๊ทธ๋Ÿฐ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ๋†€๋ž์Šต๋‹ˆ๋‹ค

ELF ๋‚ด์˜ ๊ฐ’์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์œผ๋ฉด ps2link ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ELF๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด?
ps2link๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์šฐ์ง€ ์•Š์•„ ๋ฐœ์ƒํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. sceSifLoadElf() ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฏ€๋กœ ELF๊ฐ€ ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋กœ๋“œ๋˜๊ธฐ ์ „์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์›Œ์ง€์ง€ ์•Š์œผ๋ฉด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ELF ๋‚ด์˜ ๊ฐ’์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์œผ๋ฉด ps2link ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ELF๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด?

๋„ค, ELF ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋Š” ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ด๋ฒˆ ํ˜ธ ์ œ๋ชฉ์ด ์ข€ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ps2link๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง€์šฐ์ง€ ์•Š์•„ ๋ฐœ์ƒํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. sceSifLoadElf() ํ•จ์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฏ€๋กœ ELF๊ฐ€ ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋กœ๋“œ๋˜๊ธฐ ์ „์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์›Œ์ง€์ง€ ์•Š์œผ๋ฉด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const int๋Š” .sdata(์ •์  ๋ฐ์ดํ„ฐ) ์„น์…˜์— ์žˆ์Šต๋‹ˆ๋‹ค. .sdata ์„น์…˜์ด elf ํŒŒ์ผ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์–ด๋”˜๊ฐ€์— 16bytes/128bit ๋‹จ์œ„๋กœ ๋ณต์‚ฌ๋œ ๊ฒƒ ๊ฐ™์•„์š”. ์•„๋งˆ๋„ .sdata ์„น์…˜์ด 128๋น„ํŠธ์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋Š” ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ณ  ๊ทธ ์ž๋ฆฌ์— 0์ด ๋‚จ๊ฒŒ ๋ ๊นŒ์š”?
๋˜๋Š” .sdata ์„น์…˜์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณต์‚ฌ๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ 0์œผ๋กœ ์ฑ„์›Œ์ง„ ์„น์…˜์ด ์˜†์— ์ œ๋Œ€๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  .sdata๊ฐ€ ๋ณต์‚ฌ๋œ ํ›„์— ์˜์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”,
@sp193 ์ด ์˜ณ์•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ps2link ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์œผ๋ฉฐ ์ด์ œ scr_prinf ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด์—์„œ ์ถœ๋ ฅ์„ ๋ณด๊ณ  ๋‹ค์Œ์œผ๋กœ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ULaunchELF ๋˜๋Š” PCSX2 ์— ๋กœ๋“œ๋จ

ํŒŒ์ผ์˜ ๋‚ด์šฉ

#include <stdio.h>

void init_scr(void);
void scr_printf(const char *, ...) __attribute__((format(printf,1,2)));

extern const int i1, i2, i3, i4;

int main()
{
   init_scr();
   scr_printf("i1=%d\n", i1);
   scr_printf("i2=%d\n", i2);
   scr_printf("i3=%d\n", i3);
   scr_printf("i4=%d\n", i4);

   while(1) {}

   return 0;
}

const int dum1=1;
const int dum2=2;
const int dum3=3;
const int dum4=4;
const int dum5=5;
const int i1=1111;
const int i2=2222;
const int i3=3333;
const int i4=4444;

์ปดํŒŒ์ผ ๊ณผ์ •

ee-gcc -o hello.elf hello.c -L$PS2SDK/ee/lib -ldebug

์ด ๊ฒฝ์šฐ PCSX2 ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ
Screenshot 2020-01-15 at 09 47 54

๋ณด์‹œ๋‹ค์‹œํ”ผ ๊ฒฐ๊ณผ๋Š” @rickgaiser ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

i1=1111
i2=2222
i3=3333
i4=0

๊ฐ์‚ฌ ํ•ด์š”

ps2link๋Š” SifLoadElf ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ elf ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
https://github.com/ps2dev/ps2link/blob/1ec566c54bb8b567ee0a702982b392f37807b5e2/ee/cmdHandler.c#L138

ps2sdk์—์„œ:
https://github.com/ps2dev/ps2sdk/blob/5385a6ccd9db8c9fa54ecfd8af45322a5908bf6d/ee/kernel/src/loadfile.c#L129

๊ฒฐ๊ตญ IOP์—์„œ RPC ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. LOADFILE์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

LOADFILE์˜ ๋ฒ„๊ทธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ํˆด์ฒด์ธ์ด LOADFILE์ด ์˜ˆ์ƒํ•˜๋Š” ๋Œ€๋กœ ์„น์…˜์„ ์ •๋ ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? sbv_patches๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๋“ค์ด LOADFILE์„ ํŒจ์น˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์„ ํŒจ์น˜ํ•ฉ๋‹ˆ๊นŒ?

LOADFILE์šฉ SBV ํŒจ์น˜๋Š” LoadModuleBuffer()์šฉ RPC ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ ํ•ด๋‹น ๊ธฐ๋Šฅ์€ LOADFILE์˜ ์ดˆ๊ธฐ ๋ฒ„์ „์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Sony๋„ ์ด๋ฅผ ํŒจ์น˜ํ•˜๋ฏ€๋กœ ๋ถ„๋ช…ํžˆ ๊ฐ„๊ณผ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒ„๊ทธ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

crt0์€ 16๋ฐ”์ดํŠธ/128๋น„ํŠธ ๋‹จ์œ„๋กœ .bss ์„น์…˜์„ ์ง€์›๋‹ˆ๋‹ค. .bss ์„น์…˜์ด ์ตœ์†Œ 16๋ฐ”์ดํŠธ/128๋น„ํŠธ๋กœ ์ •๋ ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ps2sdk์˜ ๋ง์ปค ํŒŒ์ผ์— ์˜ํ•ด ๋ณด์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ binutils์˜ ๊ธฐ๋ณธ ๋ง์ปค ์Šคํฌ๋ฆฝํŠธ(์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/ps2dev/ps2toolchain/commit/7c494f217d379639aaca23d3c588e48986177a51)๋Š” crt0์— ๋Œ€ํ•ด .bss ์„น์…˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .sdata์˜ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ ๊ฐ’๋„ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์—์„œ ๋‚ด์žฅ binutils ๋ง์ปค์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. newlib PR์˜ ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IIRC, ํ•ญ์ƒ ์„น์…˜์ด 128๋น„ํŠธ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. DMA ์ •๋ ฌ์ด๋‚˜ ์ด์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ์— ๋ณ‘ํ•ฉ๋œ newlib PR, ํŠนํžˆ ๋‹ค์Œ ์ปค๋ฐ‹์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/ps2dev/ps2toolchain/commit/f5544b8d68fbdf611e277e9583714ae6627f3a61

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰