From fc6d0000c52a8548967957118fb2ff018473572a Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 16 Aug 2022 22:06:18 -0300 Subject: [PATCH] added auxv to elf stack setup the needed ones for rtdl; AT_NULL, AT_PHDR, AT_ENTRY, AT_PHNUM, AT_PHENT --- initrd/sbin/init | Bin 1280 -> 4224 bytes src/include/kernel/elf.h | 6 +++ src/sys/sched/elf.c | 81 +++++++++++++++++++++++++++++---------- 3 files changed, 66 insertions(+), 21 deletions(-) diff --git a/initrd/sbin/init b/initrd/sbin/init index c76ad65efcd6b6c8eefaa45014683ddbb31a8b6c..097089d59a49e5413aceabb7e23a9bf71e12fed3 100755 GIT binary patch literal 4224 zcmcInU2GIp6h6ECq5oY3LIVaiO0}pNT8L3Zpxf=XQ&U<(+XSP{u-)C#HT%=-PN6j# zN-89kmj>gDF@lLPyqKs@O)&h`0GgO!d@()|Bgr->mbWG<>v!(lvt5R*J{V83bME=h z@4Ykkp1UVPy==et_C*9j?aoB2_@Mf!0$cfO6Ke0@O|gKjq(~ zLkq7`Rzzjs>~~n}!Ii!6Mr|itDr8=vb($$Zj1~WcgMx%RD5*JdtrxWZLb+er3!l~r za*{|#^}>h!Zfd`q+D~|^wihn*+cA;N>`25%b|j)kHoY=mj>p9F7m}1Bm*Q;mSP4b- zD)>g=KB_9b$AatlgdG_RXUMXWC@*5gQg&vFtgIc**u;n`mwc7Z`mBLtaeYlixXguP z=LTSv`v{L~g;YGqKmS3QpYqKg;@P;h9V3>*Ud)+*{nWwJU)t4E_-yWS?7#%elx4y#)75|d5KY35F*(LMpz5V9Z!^X1@r13W#-IX zkGcEDZ1YMD=FAn3Ia~3Y*H3}``mYh>XAEJKxsz+foC*chT%In+Jm2~=|NCo!*RNN6 z2{X^|g1erA{g$CiM=)pQg_?3fI1Vq?t7YoM;+0`E1jXerRwDQQ1D$GkVWl=+PZab8 zp`e-NyuFL<2QKm!FlTL==9%H;Z;E0pFc&TvfUKkcfc zyKl%J^hYvw+{jXQF!++c1<-bX+fJj+Xr+QWW#F*;2jcfsPWSU}6MkPFs>S*2te5CF zDZGw&%L&H3Md3BXo2VGy1Hp@P@4T!2y&Ave!VhZPheM}0&L{+a_3hYmjLY|x(YUE` z`9|LcuJXF#%xZhyyBJa{KR~Ok!&#-PrO#dSJ*V&*I`5kAXTUk{k}K~5@KWmxxFr59 za1Yg^&pCCn9n%l^d8mQpJ60ebi};o5NB4oR^)?cpzhcY$FNN0;pP{)(PEmT~ zjabCS7S&aR`Z`q+PEL_lf=3F$?O4|4>N{WU3moVPlGWYY-x27w`n$RYLW9;|prbcr z(aL>d@IcU#cxs9wM6+pYES!oaVkqLFTSq(=+r*sT52dZfD5I#1dg+JYkceav64P5@VIXh>cll zrN~f|h7-?S`G%A62pLDyw&SZRF;FH<)5#?6O!8g)SH2km@CjiLJ0$mCxfjd*SF4q+ zjF~@)ANMZtmwu*hRKU3pGf6*^^Gf>PcIdd5iNEwaa79NPhBL#dQ~agxwE^eY;=iQ( zCAcE#myYDbkTLV!_;KtG7C_Sfz!k}P$vGPEbLS5N<5beG|Nn#Nc-z_)UNvjxT2^y zYVM9_0q2|KI$R2+Z$J@=O1b|68qk!a7{x{Y%_q z@GY)i`qZ+%(6vb6noIq{Pq_T05Bc>6C3X_VEuVsdF{xkf3oY9Jpg3yocggQU=K5P* zxcEQk!u4_}A6Bs}@4nddu+A@qt%H*9oKnB+-)dk|`$PV$0QE^iM=a#kBCW-sl>evt L!u*~XuHyeUWM=6! literal 1280 zcmb_c&ubGw6n?w*m&G4z?ZHx!6%pDVmPA3MibTTNIfw@_Ac8L2bYlzMRCgy(#b6*P zT|yzp`UiONqDN0ws2aR^5qj)J2s9T@mJ*Eb&CbL%5KnzD^S$@I@4cO!nce61%^SL= zfifMg0Y#<;25}jh$PUFoa|SM>CIcfdEVP4vQ{;&{g&VT9!fsa9>Z|kV>O_PGU}>!TSLheyY=k5SjHC^5cqYgPw943SA04?T*pD!BsQVFACk=~avua_type = AT_PHDR; + auxvstart->a_val = (uint64_t)phdrdatastart; + auxvstart++; + + memcpy(phdrdatastart, phs, header.ph_count * header.ph_size); + + // AT_PHENT + + auxvstart->a_type = AT_PHENT; + auxvstart->a_val = header.ph_size; + auxvstart++; + + // AT_PHNUM + + auxvstart->a_type = AT_PHNUM; + auxvstart->a_val = header.ph_count; + + // AT_ENTRY + + auxvstart->a_type = AT_ENTRY; + auxvstart->a_val = header.entry; + auxvstart++; + + // AT_NULL + + auxvstart->a_type = AT_NULL; // copy the data - *envpptr = envstart; - *argvptr = argstart; if(interp){ strcpy(argdatastart, interp); @@ -147,7 +173,9 @@ static void* stacksetup(char* interp, char** argv, char** env){ int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){ elf_header64 header; - elf_ph64 ph; + elf_header64 progheader; + elf_ph64 ph; + int err = 0; int readc = vfs_read(&err, node, &header, sizeof(elf_header64), 0); char* interp = NULL; @@ -159,8 +187,13 @@ int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){ if(readc != sizeof(elf_header64) || (!check_header64(&header))) return EINVAL; + progheader = header; // incase an interpreter exists // find out if this needs an interpreter + // and also save the executable's program headers + // for auxv + + elf_ph64 progphs[header.ph_count]; for(size_t currentph = 0; currentph < header.ph_count; ++currentph){ readc = vfs_read(&err, node, &ph, header.ph_size, header.ph_pos + currentph*header.ph_size); @@ -169,10 +202,14 @@ int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){ if(readc != header.ph_size) return EINVAL; + memcpy(progphs+currentph, &ph, sizeof(elf_ph64)); + if(ph.type == PH_TYPE_INTERPRETER){ // load the name and elf header of the interpreter + progheader = header; + char* interp = alloc(ph.fsize + 1); if(!interp) return ENOMEM; @@ -204,8 +241,6 @@ int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){ goto _fail; } - break; - } } @@ -265,7 +300,11 @@ int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){ } - void* stack = stacksetup(interp, argv, env); + + + + + void* stack = stacksetup(interp, argv, env, progheader, progphs); arch_regs_setupuser(thread->regs, (void*)header.entry, stack, true);