๋ค์ ์ฝ๋๋ ์๋ชป๋ ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค.
#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 ๋ถ๋ฌ์ค๊ธฐ ์ค ์ด๋๊ฐ์์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ป๊ฒ ๊ทธ๋ฐ ๊ฒฐ๋ก ์ ๋๋ฌํ๋์ง ๋๋์ต๋๋ค
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
๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅ
๋ณด์๋ค์ํผ ๊ฒฐ๊ณผ๋ @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
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฒ๊ทธ๋ฅผ ์ฐพ์์ต๋๋ค.
crt0์ 16๋ฐ์ดํธ/128๋นํธ ๋จ์๋ก .bss ์น์ ์ ์ง์๋๋ค. .bss ์น์ ์ด ์ต์ 16๋ฐ์ดํธ/128๋นํธ๋ก ์ ๋ ฌ๋์ด์ผ ํฉ๋๋ค. ์ด์ ์๋ ps2sdk์ ๋ง์ปค ํ์ผ์ ์ํด ๋ณด์ฅ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ binutils์ ๊ธฐ๋ณธ ๋ง์ปค ์คํฌ๋ฆฝํธ(์ฌ๊ธฐ์ ์ถ๊ฐํ์ต๋๋ค: https://github.com/ps2dev/ps2toolchain/commit/7c494f217d379639aaca23d3c588e48986177a51)๋ crt0์ ๋ํด .bss ์น์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌํ์ง ์์ต๋๋ค. .sdata์ ๋ง์ง๋ง ๋ช ๊ฐ ๊ฐ๋ ์ง์์ง๋๋ค.
์ฌ๊ธฐ ์์ ๋ด์ฅ binutils ๋ง์ปค์คํฌ๋ฆฝํธ์ ๋ํ ์์ ์ฌํญ์ ๋ง๋ค์์ต๋๋ค. newlib PR์ ์ผ๋ถ๊ฐ ๋ ๊ฒ์ ๋๋ค.