From e9790c5b02d50adb1621be82dc6ce8e50849663e Mon Sep 17 00:00:00 2001 From: Mchan2003 Date: Sun, 6 Apr 2025 22:53:09 -0700 Subject: [PATCH 1/2] add elf_parser .hpp with function to open the elf file and read out the elf header Completed Section and Program header parsing implement function to store lsda into a binary file and another to close the elf file fixed formatting fixed syntax errors --- CMakeLists.txt | 12 ++ binary/lsda | Bin 0 -> 13102 bytes binary/lsda_objcopy_onlysection | Bin 0 -> 13102 bytes conanfile.py | 5 +- include/elf_parser.hpp | 191 ++++++++++++++++++++++++++++++++ src/main.cpp | 20 +++- 6 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 binary/lsda create mode 100755 binary/lsda_objcopy_onlysection create mode 100644 include/elf_parser.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e2ed707..d44bcaa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,11 @@ cmake_minimum_required(VERSION 3.27) project(safe LANGUAGES CXX) +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) # Ensure only standard C++ features + + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) add_custom_target(copy_compile_commands ALL COMMAND ${CMAKE_COMMAND} -E copy_if_different @@ -8,10 +13,17 @@ add_custom_target(copy_compile_commands ALL ${CMAKE_SOURCE_DIR}/compile_commands.json DEPENDS ${CMAKE_BINARY_DIR}/compile_commands.json) +# Find package dependancies +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/build/Debug/generators") #TODO: Remove due to this being a temporary patch for libraries to work +find_package(libelf REQUIRED) # Create the executable target add_executable(${PROJECT_NAME} src/main.cpp) +#Linking Libraries +target_link_libraries(${PROJECT_NAME} libelf::libelf) + + # Add include directories target_include_directories(${PROJECT_NAME} PUBLIC include/) diff --git a/binary/lsda b/binary/lsda new file mode 100644 index 0000000000000000000000000000000000000000..72aac9062a8c01f478a09253ad60e68139ecb8ca GIT binary patch literal 13102 zcmeHN36zx8v99{>U)}w8_w+K%4ATt5HZu$w5W!547)>TUEF2 zR#o@btthR}S=4~2L8JvYzn$oh&LE~v+?a?7pGS`nRa9^q{f6i_(t+v8B1Kb0X_TE? zA3ZFAc3gFOAU*6zMX4>Pg=azG64mvr9ogEgfWaoX0&hlAC z;bVi2xMLAzPu&I9BD;#5Jn8|y9_;iK8p4q>p?%yO@T=yxi-cy{i$!@WIGc7`gzsI) zZCYxVTK$A}dL{vdx(M}!jJ|x+E~eMHsf%;&ZuJxd=EmEu;3%C1@mXty87Q>alNZP9 zcotkRo)ITMsUc(+(VvO_JkyL~nqhy8X2yGd2Y7(DzaMb4tyZke3T~)L?Xy?Ok{GSY z#h~J&b0_yYrJN83S<%~vGJ3n;zHYM6Ao+cq?(%bXxjFqp9mhh)1<`F5blj2^+*_0S zXOESQF?uFDp5>#bvdgY)akvDWeWj?=MnytKYSnk|0%Cwnl(?Gj*V!W&FEv&bq ztvt|5N^sYOu9x#)>}AhZ?j1;OJ=jK4^oVh!@b?(f)r__ICJR7}ihf*L zpA|mO>!j3Wvixc}C@ta_;`AAZlqZ)%E$a4S`X6D_nXgVEICap~*$zov)!7c9LHv8W z@n?34N5P;sH=n)*^euuttG3DijO?`dkMf#juyW%Kxq9Wru#l4&r7hs>UMy#g8D`0G zW0o3go8gVdddJ=AFMu}rsVI$cFd{ceQ@Ka(jJTs!wI1Vm-%@LBs*QjyzBEav`p~X& zd>-K+KZ^1?mbrdzYXjUa(#dajc%;~GDm*~Erkhvf_^pQ22m+v`G!0xtz;+5FQpyJA6pVFXIaCvl`&Kovbkdy zT*qz52*q>#hMen-5DfqxW zvdksNZ(LLkmW|62uiDK@a6y%pQ@{C5zf1Id_70mCvmsi~*@tZEX8|m;viI5ap-w7z zu8q_6g|$_>gB&Xtnx%BRt?VH}D+F|}hydIrf;#You10ms|D0~oA}cQCVobB94-yUF z>;)d|J&?c0*^@mqRRu4yvS)j!y#d(IWH0m38|JgPhxkfNt(rbUG?=qzdug|})Y*!S z^U`K*>2oW#-An7VrBf!h$xBP@C{ejrK=6`RP`BPIK%dc7jE-GFQK9A#d8^sMbU^Ko zj@m_-jPIi6QM1+1(>-~;p?xM!nejdR|3dN4^hm`=p2jc@<^{aM(1rxeVK>_WK#x>wdGhQ&9?6#DiK+o zL0fbwoD_L0gJyd=LBw*eY|W$tK6y2hhBz`XgQhqjneWK_4BG9NsTtHSAn$`*E#mTk zlw?w;Ai(0F^vqj^(*(w-t(LAX7DTZrI1N3Cm#!>xeRf+>^yLQ2eD$X5x^pO zntz6Ws29h>UW)iBmV&EbM<@4|oQ`o33G)(1Hbkrm4U#tJUzAsHlysizbL0*=%%+DW z!z>zXHA?Z!*j{_x`PUf;-GVu4Q-2z(Z*Z}pBK-d#e>FEqp(}jA`;0w>gk|VR6qlQfAZZ+U5moJXsF?2*Q3Z zZ&1)$|mLWC|w@&a8!%J*AZPQ6L{fXs_zTC_$%6!Y61%)&w zQ#KZIzbsi<$m6qK0?DH6?Tm^6IoKfWa}B^Xxi7<`c5fto8l}i6;>IVvbDXV(^ihT! zF64cgvZs*GWX^?*UfHEKDvs8kiui3zBbivqSWybT_q~Ih<%P5=L$($2^h{Y-$ggD1 z1K;kNB{nJ+*Io<0evM>c3LkVn?k#oBHdMa8E?-CGQ=NC$+{UPwT?;yotZe`us=XaL zzgj383R85x68*jsdbH$gM_Y2PFAJOES z=v))o*Cg4Aiqfyai@5yfFY=2P;sLaQ^%dO5ORcRo9kbKib@bo-#3FNZd6bG}l>K&; z<_83Y(}66&!-8@u!ei6qaD*48fqzfhU8sCBB&eJiR>C7;h2M=R+&(JP(`i^#F^klq z?}~m4=*j7dIFt?q<}LoIDE$YuTfun?`DZ;m)YHg|9$ID#;M4ZKfIE8>F4L$Nuv=j>(bo|pqzvJaW2an2#8;v}w`biQVC1F1bw9h*oC zy6s}UBCX`0wi$biscTaH?Q&e(jJ?a$H-YmN%1v}voIlWoWdzgogtZE116|C`w==z; zG+?R{-R{~9JyA;GqvY*2wBLPu6~!o$s^y|9QTy<;tfm7Z^JTcZ^HFj z(xVAv^Xms+0@*U|ysJ>QyrKMJ%7=>nQl*i=1M;S!wwC^CQ(3XfrnH>;4LmFhh1MJW zy@1q>wx7%HVQ8*~pvyVd$xufPLHk(Q2yS0YL~Cxe{ap6W1l?YaZGlr!x>v2(JVP6e z0I}Z);0}ohJ=7T0H`K-$&PtBAi^)xKQr9+ZL)4YC``ENr71+$NZa8tP;E`6WgH7)! zc+84@YG{gi#+`$&!qckhy?P6jy;SHmZRaD7&Bw_>g&(wH?Sx*^SbK+w?YC)!jT7i+ zwg4Qdk>hL;(5@8$8HVo)igF$MJ*JFl9xeh^_{Esa$Du+Gwx?KB%C$#Zw91N;X8r~h zJ=vaS(NNAEYtfoSMOdTl(fr_ci}okBg^L=;5ACw(P;&SDFW5)00aaTI;h(l1`2%o6 z*}P`aX>J?G{r`-$-La0xAp0%)K*t0h^-E2kl~JN$Rf(vF*=X}l>m#0Q^HE!Ht=3Ky zH9)j_pRSIi1JHQn`o+G!p5g*pl`f+Tct#Du9mwh$AUc>a(*}NTtqxda9qV*r6eiUj zy&UlTfPeVo&^ z34K&YDjIXwdQ#Ga$Ee9(++cto_!%0foM|HGs>Uf_mG|N}{tFfOR@BEV5zn$$wzoQ{XPZ4BoD(!IvKaBv8;5Bns zIT|$1bZDp*8|cs(To(DMmx=WV(ECQt_~}zqd!a*XJ#x}dUA%CgrC#f>pC);64@?WZ zR;K{1^QMF3nAZY%XP*TD!+jP+PIY8~pXT@*x?}JUXtFv>zdAHmbbDYhN}uIlcVj8{ zaS2N&pP9yT#%pk3*x;B_OIAB(x+SL_bJCLGe$&y&0KXYxhVya9%oPi4>m(iUak2XN zO&5*a__%#=;{<4 zjLVfgeB3Cl=mCgVqjj^irbiUkJn(D>jQizuEs0EyxPdCVRkp*PJ17B3{#o+sOcJ^Ie~^K3<(wiJ{c6i-O~yIZ%TUt z@X+uz2(H75{xmH8B9+_m?<*U=q@3@c>Y?}H=si?w3*e3RPXSNxC_F!L25!_E`*aQW z=UKI>of!)6+sj)7c$Z$J@AthI0lcENP8;0!<8!RRHjPdkXTH3c`_MkD!(vYl-`m+# z7QUP4jr1}b@X_qJwA}kNyW8K>)>oE8qryKTdOf|n2k_*a1i?c%$I@OY_l}KG@6dg? z#EMQAz%%s57W(A61p8&GcSDSZE5VlN1OdFWlHhVWe5nMTf5b|#l-=@R+9%eUmq(x1 zmT7t1vyK$!@t8W$V?^DF2Kb42HxV7rlT&%g8LlY3k&D1PS9#~x8k0x8a%E~B53M6Z z^LV!M4z4@F06$1Cs@LSnM|t#tg6Or{cntVGgBb~;^@$Toa4GMyh6qiUc)av1|NA(; z@uk|_$H=K1Gt&GPFfRLxYnv6e0LDef)*Lg#qi`Re;0|r1Z;6dUuaF$bF(X3CFgh$9 zYMWjWB{~w7H96*7RN<{PWL}OrRO65qka$a&6pTq4Qhn{AZZ?Y1q?#M+3 zNv`8-3i}yD~7kjb1XC<*pALAO=%b)m;``rw07mH6a(iJWn2BKCgEX<$D zC!#sv12~*oa!ja0@*d|JyxsUg+;4~Oh4h~z30Zk5o4l@v0V29X{-gtIXKC^_;cZ=g z>vQ@*M5D(oHM}DY4K>K#Rwj=3uRTu=Hvg^9<33}(8ZIrhc&?`&SQDiipC8DY_;l;! zQJEjVrAVZbeOI9;E#xUz3pH905Wdaen)GfphUI*7m6j@%RAo_vHTBIqHHFt5cf#(e z49`1Wg!8a@t|frs_{)Vpu@%!plx9oHp$t+k2qu7O$CwSA>bd^-G#YQo&@|d;)tV5b zMMlbkbimYF6r?w7*%6?Fc7vm7G{$S@2I&(G3wrph6G1BVS!aVZ2|+-BR`}9Ea?odi zyuxQez#zwh$Q?m}7-WhdcxBpEh)zO+_C|+fLP&f0&!I(i;)3eXT=Cf95Bwxzhjo69 z9hUnwb{Or`*r8p(AnSM9Z(hNh0>9~QWR_!Q7@6dlHD&~tJLaHRU^^@6fX8{PDL%8r zW6klIK90QO&_+j&IHs3B7uMA;An6{EVF821c7DIRF~oZ2sVqB~7wTfs#ptfbf5i}A zejTcNwhiCvo@-}YvNp`ij4TcF8yd;)w&!tKgpPVvm_ZTR8OTFnWbj_V1JX*g25Hm@ z5jqzZz{L@`$jWj5JIF-LFpBScU8uymYP!&IBY?--F~GR%1N>&<{OQIFf8mkbxekpo zn_$qU_=*4z(BN~p|COl1>ff-f1CRGMCAOxZt5M8-2zT0a$kW^DT#Hsm@$O(`=6nOV zIAJMs@0$vvv&=it-!+#$O~-(&$=YZGeo>=6G#3vlwtJR2pVXoy(H|4F%lyy)?vM;B z+^9ndy5yWE0Ng)GaCsdxZuue!I^T#HV3NxVXn{36=am9Fnk#=P;I?&TNdXVhJkXAM z-E83J7vQB{_lDA^;rV&}8oZZ^7nbr4LmwvYSL$=L1OM&=HaH`eTQtl{b#b^1aYr!e zar~{H$2+r)Nw3!Ox!z3klcn!Hk6ZdxiBgiowFkmUudaFb2%)#v$S?R|d5)h=jRR8Y z(ikUi#0qt*#0i1huHHx3^x|yErFvkTrUypetze}+!5iBKH@%>#<|IS9oQK!&6ekU>q(X2kUYao7Lx2^T}s*7tTy| z$aH@}ue&Beug^Vje7scqxW_B~1H8f~-2*(+fmh_CiIXr!MS1XExX!)95)TFvy}rV- z(9f}KHZUILLL*&0iJ0%AepZ7_b^E8B%jis&wm6e$A3tF0RD6Z&J*xKjf`^mUC%(dS zaV6IX-Vy)(`kcvuX5Fxs%iM@PxiEDf`J$n^u${^6sKe{K$NVyWhw?>>3+p`443EI+ z1g?+HKm7iB@~W+0_%T6B_fOEdD_b}d>5912%5eAN-=Jr8<)Xcok4UF5VZPRekT8`+ zA?jx2?GR1V*kz1IwuI=EN6v)k9j_b>(K?^>3)3loV)+IT^g_r_uSfYY*_B2k87bEJ z$a;@UL$9G}$qA|E8z z>8pe!1O6Rt<%x8>o=!n3oc!WF>o-#CE-Yu=ZzCIuyJ8#J;i2f%c3WYU);P!QQ{)!e zWYH&#yO4QSCcu=s=y2F#eTcQZ$Y09T=nL>@cS< zjH~R&`4rW;i_AQ9d6Z)pr_oLaiBVb^%mUn1lTXTjbE4mW&U)}w8_w+K%4ATt5HZu$w5W!547)>TUEF2 zR#o@btthR}S=4~2L8JvYzn$oh&LE~v+?a?7pGS`nRa9^q{f6i_(t+v8B1Kb0X_TE? zA3ZFAc3gFOAU*6zMX4>Pg=azG64mvr9ogEgfWaoX0&hlAC z;bVi2xMLAzPu&I9BD;#5Jn8|y9_;iK8p4q>p?%yO@T=yxi-cy{i$!@WIGc7`gzsI) zZCYxVTK$A}dL{vdx(M}!jJ|x+E~eMHsf%;&ZuJxd=EmEu;3%C1@mXty87Q>alNZP9 zcotkRo)ITMsUc(+(VvO_JkyL~nqhy8X2yGd2Y7(DzaMb4tyZke3T~)L?Xy?Ok{GSY z#h~J&b0_yYrJN83S<%~vGJ3n;zHYM6Ao+cq?(%bXxjFqp9mhh)1<`F5blj2^+*_0S zXOESQF?uFDp5>#bvdgY)akvDWeWj?=MnytKYSnk|0%Cwnl(?Gj*V!W&FEv&bq ztvt|5N^sYOu9x#)>}AhZ?j1;OJ=jK4^oVh!@b?(f)r__ICJR7}ihf*L zpA|mO>!j3Wvixc}C@ta_;`AAZlqZ)%E$a4S`X6D_nXgVEICap~*$zov)!7c9LHv8W z@n?34N5P;sH=n)*^euuttG3DijO?`dkMf#juyW%Kxq9Wru#l4&r7hs>UMy#g8D`0G zW0o3go8gVdddJ=AFMu}rsVI$cFd{ceQ@Ka(jJTs!wI1Vm-%@LBs*QjyzBEav`p~X& zd>-K+KZ^1?mbrdzYXjUa(#dajc%;~GDm*~Erkhvf_^pQ22m+v`G!0xtz;+5FQpyJA6pVFXIaCvl`&Kovbkdy zT*qz52*q>#hMen-5DfqxW zvdksNZ(LLkmW|62uiDK@a6y%pQ@{C5zf1Id_70mCvmsi~*@tZEX8|m;viI5ap-w7z zu8q_6g|$_>gB&Xtnx%BRt?VH}D+F|}hydIrf;#You10ms|D0~oA}cQCVobB94-yUF z>;)d|J&?c0*^@mqRRu4yvS)j!y#d(IWH0m38|JgPhxkfNt(rbUG?=qzdug|})Y*!S z^U`K*>2oW#-An7VrBf!h$xBP@C{ejrK=6`RP`BPIK%dc7jE-GFQK9A#d8^sMbU^Ko zj@m_-jPIi6QM1+1(>-~;p?xM!nejdR|3dN4^hm`=p2jc@<^{aM(1rxeVK>_WK#x>wdGhQ&9?6#DiK+o zL0fbwoD_L0gJyd=LBw*eY|W$tK6y2hhBz`XgQhqjneWK_4BG9NsTtHSAn$`*E#mTk zlw?w;Ai(0F^vqj^(*(w-t(LAX7DTZrI1N3Cm#!>xeRf+>^yLQ2eD$X5x^pO zntz6Ws29h>UW)iBmV&EbM<@4|oQ`o33G)(1Hbkrm4U#tJUzAsHlysizbL0*=%%+DW z!z>zXHA?Z!*j{_x`PUf;-GVu4Q-2z(Z*Z}pBK-d#e>FEqp(}jA`;0w>gk|VR6qlQfAZZ+U5moJXsF?2*Q3Z zZ&1)$|mLWC|w@&a8!%J*AZPQ6L{fXs_zTC_$%6!Y61%)&w zQ#KZIzbsi<$m6qK0?DH6?Tm^6IoKfWa}B^Xxi7<`c5fto8l}i6;>IVvbDXV(^ihT! zF64cgvZs*GWX^?*UfHEKDvs8kiui3zBbivqSWybT_q~Ih<%P5=L$($2^h{Y-$ggD1 z1K;kNB{nJ+*Io<0evM>c3LkVn?k#oBHdMa8E?-CGQ=NC$+{UPwT?;yotZe`us=XaL zzgj383R85x68*jsdbH$gM_Y2PFAJOES z=v))o*Cg4Aiqfyai@5yfFY=2P;sLaQ^%dO5ORcRo9kbKib@bo-#3FNZd6bG}l>K&; z<_83Y(}66&!-8@u!ei6qaD*48fqzfhU8sCBB&eJiR>C7;h2M=R+&(JP(`i^#F^klq z?}~m4=*j7dIFt?q<}LoIDE$YuTfun?`DZ;m)YHg|9$ID#;M4ZKfIE8>F4L$Nuv=j>(bo|pqzvJaW2an2#8;v}w`biQVC1F1bw9h*oC zy6s}UBCX`0wi$biscTaH?Q&e(jJ?a$H-YmN%1v}voIlWoWdzgogtZE116|C`w==z; zG+?R{-R{~9JyA;GqvY*2wBLPu6~!o$s^y|9QTy<;tfm7Z^JTcZ^HFj z(xVAv^Xms+0@*U|ysJ>QyrKMJ%7=>nQl*i=1M;S!wwC^CQ(3XfrnH>;4LmFhh1MJW zy@1q>wx7%HVQ8*~pvyVd$xufPLHk(Q2yS0YL~Cxe{ap6W1l?YaZGlr!x>v2(JVP6e z0I}Z);0}ohJ=7T0H`K-$&PtBAi^)xKQr9+ZL)4YC``ENr71+$NZa8tP;E`6WgH7)! zc+84@YG{gi#+`$&!qckhy?P6jy;SHmZRaD7&Bw_>g&(wH?Sx*^SbK+w?YC)!jT7i+ zwg4Qdk>hL;(5@8$8HVo)igF$MJ*JFl9xeh^_{Esa$Du+Gwx?KB%C$#Zw91N;X8r~h zJ=vaS(NNAEYtfoSMOdTl(fr_ci}okBg^L=;5ACw(P;&SDFW5)00aaTI;h(l1`2%o6 z*}P`aX>J?G{r`-$-La0xAp0%)K*t0h^-E2kl~JN$Rf(vF*=X}l>m#0Q^HE!Ht=3Ky zH9)j_pRSIi1JHQn`o+G!p5g*pl`f+Tct#Du9mwh$AUc>a(*}NTtqxda9qV*r6eiUj zy&UlTfPeVo&^ z34K&YDjIXwdQ#Ga$Ee9(++cto_!%0foM|HGs>Uf_mG|N}{tFfOR@BEV5zn$$wzoQ{XPZ4BoD(!IvKaBv8;5Bns zIT|$1bZDp*8|cs(To(DMmx=WV(ECQt_~}zqd!a*XJ#x}dUA%CgrC#f>pC);64@?WZ zR;K{1^QMF3nAZY%XP*TD!+jP+PIY8~pXT@*x?}JUXtFv>zdAHmbbDYhN}uIlcVj8{ zaS2N&pP9yT#%pk3*x;B_OIAB(x+SL_bJCLGe$&y&0KXYxhVya9%oPi4>m(iUak2XN zO&5*a__%#=;{<4 zjLVfgeB3Cl=mCgVqjj^irbiUkJn(D>jQizuEs0EyxPdCVRkp*PJ17B3{#o+sOcJ^Ie~^K3<(wiJ{c6i-O~yIZ%TUt z@X+uz2(H75{xmH8B9+_m?<*U=q@3@c>Y?}H=si?w3*e3RPXSNxC_F!L25!_E`*aQW z=UKI>of!)6+sj)7c$Z$J@AthI0lcENP8;0!<8!RRHjPdkXTH3c`_MkD!(vYl-`m+# z7QUP4jr1}b@X_qJwA}kNyW8K>)>oE8qryKTdOf|n2k_*a1i?c%$I@OY_l}KG@6dg? z#EMQAz%%s57W(A61p8&GcSDSZE5VlN1OdFWlHhVWe5nMTf5b|#l-=@R+9%eUmq(x1 zmT7t1vyK$!@t8W$V?^DF2Kb42HxV7rlT&%g8LlY3k&D1PS9#~x8k0x8a%E~B53M6Z z^LV!M4z4@F06$1Cs@LSnM|t#tg6Or{cntVGgBb~;^@$Toa4GMyh6qiUc)av1|NA(; z@uk|_$H=K1Gt&GPFfRLxYnv6e0LDef)*Lg#qi`Re;0|r1Z;6dUuaF$bF(X3CFgh$9 zYMWjWB{~w7H96*7RN<{PWL}OrRO65qka$a&6pTq4Qhn{AZZ?Y1q?#M+3 zNv`8-3i}yD~7kjb1XC<*pALAO=%b)m;``rw07mH6a(iJWn2BKCgEX<$D zC!#sv12~*oa!ja0@*d|JyxsUg+;4~Oh4h~z30Zk5o4l@v0V29X{-gtIXKC^_;cZ=g z>vQ@*M5D(oHM}DY4K>K#Rwj=3uRTu=Hvg^9<33}(8ZIrhc&?`&SQDiipC8DY_;l;! zQJEjVrAVZbeOI9;E#xUz3pH905Wdaen)GfphUI*7m6j@%RAo_vHTBIqHHFt5cf#(e z49`1Wg!8a@t|frs_{)Vpu@%!plx9oHp$t+k2qu7O$CwSA>bd^-G#YQo&@|d;)tV5b zMMlbkbimYF6r?w7*%6?Fc7vm7G{$S@2I&(G3wrph6G1BVS!aVZ2|+-BR`}9Ea?odi zyuxQez#zwh$Q?m}7-WhdcxBpEh)zO+_C|+fLP&f0&!I(i;)3eXT=Cf95Bwxzhjo69 z9hUnwb{Or`*r8p(AnSM9Z(hNh0>9~QWR_!Q7@6dlHD&~tJLaHRU^^@6fX8{PDL%8r zW6klIK90QO&_+j&IHs3B7uMA;An6{EVF821c7DIRF~oZ2sVqB~7wTfs#ptfbf5i}A zejTcNwhiCvo@-}YvNp`ij4TcF8yd;)w&!tKgpPVvm_ZTR8OTFnWbj_V1JX*g25Hm@ z5jqzZz{L@`$jWj5JIF-LFpBScU8uymYP!&IBY?--F~GR%1N>&<{OQIFf8mkbxekpo zn_$qU_=*4z(BN~p|COl1>ff-f1CRGMCAOxZt5M8-2zT0a$kW^DT#Hsm@$O(`=6nOV zIAJMs@0$vvv&=it-!+#$O~-(&$=YZGeo>=6G#3vlwtJR2pVXoy(H|4F%lyy)?vM;B z+^9ndy5yWE0Ng)GaCsdxZuue!I^T#HV3NxVXn{36=am9Fnk#=P;I?&TNdXVhJkXAM z-E83J7vQB{_lDA^;rV&}8oZZ^7nbr4LmwvYSL$=L1OM&=HaH`eTQtl{b#b^1aYr!e zar~{H$2+r)Nw3!Ox!z3klcn!Hk6ZdxiBgiowFkmUudaFb2%)#v$S?R|d5)h=jRR8Y z(ikUi#0qt*#0i1huHHx3^x|yErFvkTrUypetze}+!5iBKH@%>#<|IS9oQK!&6ekU>q(X2kUYao7Lx2^T}s*7tTy| z$aH@}ue&Beug^Vje7scqxW_B~1H8f~-2*(+fmh_CiIXr!MS1XExX!)95)TFvy}rV- z(9f}KHZUILLL*&0iJ0%AepZ7_b^E8B%jis&wm6e$A3tF0RD6Z&J*xKjf`^mUC%(dS zaV6IX-Vy)(`kcvuX5Fxs%iM@PxiEDf`J$n^u${^6sKe{K$NVyWhw?>>3+p`443EI+ z1g?+HKm7iB@~W+0_%T6B_fOEdD_b}d>5912%5eAN-=Jr8<)Xcok4UF5VZPRekT8`+ zA?jx2?GR1V*kz1IwuI=EN6v)k9j_b>(K?^>3)3loV)+IT^g_r_uSfYY*_B2k87bEJ z$a;@UL$9G}$qA|E8z z>8pe!1O6Rt<%x8>o=!n3oc!WF>o-#CE-Yu=ZzCIuyJ8#J;i2f%c3WYU);P!QQ{)!e zWYH&#yO4QSCcu=s=y2F#eTcQZ$Y09T=nL>@cS< zjH~R&`4rW;i_AQ9d6Z)pr_oLaiBVb^%mUn1lTXTjbE4mW& str: format: `self.requires()` """ def requirements(self): - pass + self.requires("libelf/0.8.13") def generate(self): c = CMake(self) c.configure() c.build(target="copy_compile_commands") - """ Manage requirements to build our project, this includes all build tools. """ diff --git a/include/elf_parser.hpp b/include/elf_parser.hpp new file mode 100644 index 0000000..0953ceb --- /dev/null +++ b/include/elf_parser.hpp @@ -0,0 +1,191 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class ElfParser +{ + public: + ElfParser(char** t_file_ptr) + : m_file(t_file_ptr){}; + void openElf(); + void printEhdr(); + void printPhdr(); + void printShdr(); + //void printSym(); + void getSection(std::string section); + void closeElf(); + + private: + int m_elf_class{ 0 }; + int m_fd, m_fbin; + size_t m_n, m_shstrndx; + + char** m_file; + + char* m_name; + Elf_Scn* m_scn; + Elf_Data* m_data; + + Elf* m_e; + GElf_Ehdr m_ehdr; + GElf_Phdr m_phdr; + GElf_Shdr m_shdr; + //Gelf_Sym m_sym; +}; + +void ElfParser::openElf() +{ + if (elf_version(EV_CURRENT) == EV_NONE) { + errx(EX_SOFTWARE, + "ELF library initialization failed : %s ", + elf_errmsg(-1)); + } + if ((m_fd = open(m_file[1], O_RDONLY, 0)) < 0) { + err(EX_NOINPUT, "open \%s\" failed ", m_file[1]); + } + if ((m_e = elf_begin(m_fd, ELF_C_READ, NULL)) == NULL) { + errx(EX_SOFTWARE, "elf_begin () failed : %s . ", elf_errmsg(-1)); + } + if (elf_kind(m_e) != ELF_K_ELF) { + errx(EX_DATAERR, "\"%s\" is not an ELF object. ", m_file[1]); + } + std::println( + "{} {}-bit ELF object\n", m_file[1], m_elf_class == ELFCLASS32 ? 32 : 64); +} + +void ElfParser::printEhdr() +{ + if ((gelf_getehdr(m_e, &m_ehdr)) == NULL) { + errx(EX_SOFTWARE, "getehdr() failed: %s.", elf_errmsg(-1)); + } + std::println("ELF Header"); + std::println("===================="); + std::print("ident: "); + for (int i = 0; i < 16; i++) { + std::print("0x{:X}, ", m_ehdr.e_ident[i]); + } + std::println(""); + std::println("type: 0x{:X}", m_ehdr.e_type); + std::println("machine: 0x{:X}", m_ehdr.e_machine); + std::println("version: 0x{:X}", m_ehdr.e_version); + std::println("entry: 0x{:X}", m_ehdr.e_entry); + std::println("phoff: 0x{:X}", m_ehdr.e_phoff); + std::println("shoff: 0x{:X}", m_ehdr.e_shoff); + std::println("flags: 0x{:X}", m_ehdr.e_flags); + std::println("ehsize: 0x{:X}", m_ehdr.e_ehsize); + std::println("phentsize: 0x{:X}", m_ehdr.e_phentsize); + std::println("shentsize: 0x{:X}", m_ehdr.e_shentsize); + std::println("shnum: 0x{:X}", m_ehdr.e_shnum); + std::println("phnum: 0x{:X}", m_ehdr.e_phnum); +} + +void ElfParser::printPhdr() +{ + if (elf_getphdrnum(m_e, &m_n) != 0) { + errx(EX_SOFTWARE, "getphdrnum() failed: %s.", elf_errmsg(-1)); + } + + std::println("Program Header: ({})", static_cast(m_n)); + std::println("===================="); + + for (int i = 0; i < static_cast(m_n); i++) { + if (gelf_getphdr(m_e, i, &m_phdr) != &m_phdr) { + errx(EX_SOFTWARE, "getphdr() failed: %s.", elf_errmsg(-1)); + } + + std::println("Program Header: {}", i); + std::println("type : 0x{:X}", m_phdr.p_type); + std::println("flags : 0x{:X}", m_phdr.p_flags); + std::println("offset : 0x{:X}", m_phdr.p_offset); + std::println("vaddr : 0x{:X}", m_phdr.p_vaddr); + std::println("paddr : 0x{:X}", m_phdr.p_paddr); + std::println("filez : 0x{:X}", m_phdr.p_filesz); + std::println("memz : 0x{:X}", m_phdr.p_memsz); + std::println("align : 0x{:X}", m_phdr.p_align); + std::println("===================="); + } +} + +void ElfParser::printShdr() +{ + if (elf_getshdrstrndx(m_e, &m_shstrndx) != 0) { + errx(EX_SOFTWARE, "getshdrstrndx() failed: %s.", elf_errmsg(-1)); + } + + m_scn = NULL; + + std::println("Section Header: ({})", static_cast(m_shstrndx)); + std::println("===================="); + + while ((m_scn = elf_nextscn(m_e, m_scn)) != NULL) { + if (gelf_getshdr(m_scn, &m_shdr) != &m_shdr) { + errx(EX_SOFTWARE, "getshdr() failed: %s.", elf_errmsg(-1)); + } + + if ((m_name = elf_strptr(m_e, m_shstrndx, m_shdr.sh_name)) == NULL) { + errx(EX_SOFTWARE, "elf_strptr() failed: %s.", elf_errmsg(-1)); + } + + std::println( + "Section {}: {}", static_cast(elf_ndxscn(m_scn)), m_name); + std::println(" type : 0x{:X}", m_shdr.sh_type); + std::println(" flags : 0x{:X}", m_shdr.sh_flags); + std::println(" addr : 0x{:X}", m_shdr.sh_addr); + std::println(" offset : 0x{:X}", m_shdr.sh_offset); + std::println(" size : 0x{:X}", m_shdr.sh_size); + std::println(" link : 0x{:X}", m_shdr.sh_link); + std::println(" info : 0x{:X}", m_shdr.sh_info); + std::println(" addralign : 0x{:X}", m_shdr.sh_addralign); + std::println(" entsize : 0x{:X}", m_shdr.sh_entsize); + std::println("===================="); + } +} + +void ElfParser::getSection(std::string section) +{ + if (elf_getshdrstrndx(m_e, &m_shstrndx) != 0) { + errx(EX_SOFTWARE, "getshdrstrndx() failed: %s.", elf_errmsg(-1)); + } + + m_scn = NULL; + + while ((m_scn = elf_nextscn(m_e, m_scn)) != NULL) { + if (gelf_getshdr(m_scn, &m_shdr) != &m_shdr) { + errx(EX_SOFTWARE, "getshdr() failed: %s.", elf_errmsg(-1)); + } + + if ((m_name = elf_strptr(m_e, m_shstrndx, m_shdr.sh_name)) == NULL) { + errx(EX_SOFTWARE, "elf_strptr() failed: %s.", elf_errmsg(-1)); + } + + if (static_cast(m_name) == section) { + std::println("{} found", static_cast(m_name)); + std::println( + "Section {}: {}", static_cast(elf_ndxscn(m_scn)), m_name); + std::println("===================="); + + m_fbin = open("binary/lsda", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); + + while ((m_data = elf_getdata(m_scn, m_data)) != NULL) { + write(m_fbin, m_data->d_buf, m_data->d_size); + } + + close(m_fbin); + break; + } + } +} + +void ElfParser::closeElf() +{ + close(m_fd); + std::println("ELF file closed"); +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index cea7f40..a271541 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,23 @@ +#include "../include/elf_parser.hpp" +#include #include +#include -int main() +int main(int argc, char** argv) { - std::println("yeet: {}", __cplusplus); + std::string lsda = ".gcc_except_table"; + std::string symtab = ".symtab"; + if (argc != 2) + { + errx(EX_USAGE, "usage : %s file - name ", argv[0]); + } + + ElfParser elf(argv); + elf.openElf(); + elf.printShdr(); + elf.getSection(lsda); + + elf.closeElf(); return 0; + ; } \ No newline at end of file From 6714ca4fc432c980fa7421b2c14ad415ebabb5f4 Mon Sep 17 00:00:00 2001 From: Mchan2003 Date: Mon, 23 Jun 2025 22:27:49 -0700 Subject: [PATCH 2/2] Reworked the parser to store the elf file headers in maps and vectors, move loading of the headers to the constructor, reformat to fit libhal formatting standard --- CMakeLists.txt | 5 +- include/elf_parser.hpp | 232 +++++++++++------------------------------ src/elf_parser.cpp | 132 +++++++++++++++++++++++ src/main.cpp | 22 ++-- 4 files changed, 207 insertions(+), 184 deletions(-) create mode 100644 src/elf_parser.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d44bcaa..e912356 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,11 +14,12 @@ add_custom_target(copy_compile_commands ALL DEPENDS ${CMAKE_BINARY_DIR}/compile_commands.json) # Find package dependancies -list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/build/Debug/generators") #TODO: Remove due to this being a temporary patch for libraries to work +#TODO: Remove due to this being a temporary patch for libraries to work +list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/build/Debug/generators") find_package(libelf REQUIRED) # Create the executable target -add_executable(${PROJECT_NAME} src/main.cpp) +add_executable(${PROJECT_NAME} src/main.cpp src/elf_parser.cpp) #Linking Libraries target_link_libraries(${PROJECT_NAME} libelf::libelf) diff --git a/include/elf_parser.hpp b/include/elf_parser.hpp index 0953ceb..92b5055 100644 --- a/include/elf_parser.hpp +++ b/include/elf_parser.hpp @@ -1,191 +1,83 @@ #pragma once -#include #include #include -#include -#include -#include #include -#include #include #include +#include +#include + +#include +#include +#include +#include class ElfParser { public: - ElfParser(char** t_file_ptr) - : m_file(t_file_ptr){}; - void openElf(); - void printEhdr(); - void printPhdr(); - void printShdr(); - //void printSym(); - void getSection(std::string section); - void closeElf(); - - private: - int m_elf_class{ 0 }; - int m_fd, m_fbin; - size_t m_n, m_shstrndx; - - char** m_file; - - char* m_name; - Elf_Scn* m_scn; - Elf_Data* m_data; - - Elf* m_e; - GElf_Ehdr m_ehdr; - GElf_Phdr m_phdr; - GElf_Shdr m_shdr; - //Gelf_Sym m_sym; -}; - -void ElfParser::openElf() -{ - if (elf_version(EV_CURRENT) == EV_NONE) { - errx(EX_SOFTWARE, - "ELF library initialization failed : %s ", - elf_errmsg(-1)); - } - if ((m_fd = open(m_file[1], O_RDONLY, 0)) < 0) { - err(EX_NOINPUT, "open \%s\" failed ", m_file[1]); - } - if ((m_e = elf_begin(m_fd, ELF_C_READ, NULL)) == NULL) { - errx(EX_SOFTWARE, "elf_begin () failed : %s . ", elf_errmsg(-1)); - } - if (elf_kind(m_e) != ELF_K_ELF) { - errx(EX_DATAERR, "\"%s\" is not an ELF object. ", m_file[1]); - } - std::println( - "{} {}-bit ELF object\n", m_file[1], m_elf_class == ELFCLASS32 ? 32 : 64); -} - -void ElfParser::printEhdr() -{ - if ((gelf_getehdr(m_e, &m_ehdr)) == NULL) { - errx(EX_SOFTWARE, "getehdr() failed: %s.", elf_errmsg(-1)); - } - std::println("ELF Header"); - std::println("===================="); - std::print("ident: "); - for (int i = 0; i < 16; i++) { - std::print("0x{:X}, ", m_ehdr.e_ident[i]); - } - std::println(""); - std::println("type: 0x{:X}", m_ehdr.e_type); - std::println("machine: 0x{:X}", m_ehdr.e_machine); - std::println("version: 0x{:X}", m_ehdr.e_version); - std::println("entry: 0x{:X}", m_ehdr.e_entry); - std::println("phoff: 0x{:X}", m_ehdr.e_phoff); - std::println("shoff: 0x{:X}", m_ehdr.e_shoff); - std::println("flags: 0x{:X}", m_ehdr.e_flags); - std::println("ehsize: 0x{:X}", m_ehdr.e_ehsize); - std::println("phentsize: 0x{:X}", m_ehdr.e_phentsize); - std::println("shentsize: 0x{:X}", m_ehdr.e_shentsize); - std::println("shnum: 0x{:X}", m_ehdr.e_shnum); - std::println("phnum: 0x{:X}", m_ehdr.e_phnum); -} - -void ElfParser::printPhdr() -{ - if (elf_getphdrnum(m_e, &m_n) != 0) { - errx(EX_SOFTWARE, "getphdrnum() failed: %s.", elf_errmsg(-1)); - } - - std::println("Program Header: ({})", static_cast(m_n)); - std::println("===================="); - - for (int i = 0; i < static_cast(m_n); i++) { - if (gelf_getphdr(m_e, i, &m_phdr) != &m_phdr) { - errx(EX_SOFTWARE, "getphdr() failed: %s.", elf_errmsg(-1)); - } - - std::println("Program Header: {}", i); - std::println("type : 0x{:X}", m_phdr.p_type); - std::println("flags : 0x{:X}", m_phdr.p_flags); - std::println("offset : 0x{:X}", m_phdr.p_offset); - std::println("vaddr : 0x{:X}", m_phdr.p_vaddr); - std::println("paddr : 0x{:X}", m_phdr.p_paddr); - std::println("filez : 0x{:X}", m_phdr.p_filesz); - std::println("memz : 0x{:X}", m_phdr.p_memsz); - std::println("align : 0x{:X}", m_phdr.p_align); - std::println("===================="); - } -} - -void ElfParser::printShdr() -{ - if (elf_getshdrstrndx(m_e, &m_shstrndx) != 0) { - errx(EX_SOFTWARE, "getshdrstrndx() failed: %s.", elf_errmsg(-1)); - } - - m_scn = NULL; - - std::println("Section Header: ({})", static_cast(m_shstrndx)); - std::println("===================="); - - while ((m_scn = elf_nextscn(m_e, m_scn)) != NULL) { - if (gelf_getshdr(m_scn, &m_shdr) != &m_shdr) { - errx(EX_SOFTWARE, "getshdr() failed: %s.", elf_errmsg(-1)); + ElfParser(std::string_view p_file_name) + : m_file(p_file_name) + { + if (elf_version(EV_CURRENT) == EV_NONE) { + std::println( + stderr, "ELF library initialization failed : {}", elf_errmsg(-1)); } - if ((m_name = elf_strptr(m_e, m_shstrndx, m_shdr.sh_name)) == NULL) { - errx(EX_SOFTWARE, "elf_strptr() failed: %s.", elf_errmsg(-1)); + if ((m_fd = open(m_file.c_str(), O_RDONLY, 0)) < 0) { + std::println(stderr, "\{} failed to open", elf_errmsg(-1)); + fileOpened = false; + } else { + fileOpened = true; } - std::println( - "Section {}: {}", static_cast(elf_ndxscn(m_scn)), m_name); - std::println(" type : 0x{:X}", m_shdr.sh_type); - std::println(" flags : 0x{:X}", m_shdr.sh_flags); - std::println(" addr : 0x{:X}", m_shdr.sh_addr); - std::println(" offset : 0x{:X}", m_shdr.sh_offset); - std::println(" size : 0x{:X}", m_shdr.sh_size); - std::println(" link : 0x{:X}", m_shdr.sh_link); - std::println(" info : 0x{:X}", m_shdr.sh_info); - std::println(" addralign : 0x{:X}", m_shdr.sh_addralign); - std::println(" entsize : 0x{:X}", m_shdr.sh_entsize); - std::println("===================="); - } -} - -void ElfParser::getSection(std::string section) -{ - if (elf_getshdrstrndx(m_e, &m_shstrndx) != 0) { - errx(EX_SOFTWARE, "getshdrstrndx() failed: %s.", elf_errmsg(-1)); - } - - m_scn = NULL; - - while ((m_scn = elf_nextscn(m_e, m_scn)) != NULL) { - if (gelf_getshdr(m_scn, &m_shdr) != &m_shdr) { - errx(EX_SOFTWARE, "getshdr() failed: %s.", elf_errmsg(-1)); + if ((m_elf = elf_begin(m_fd, ELF_C_READ, NULL)) == NULL) { + std::println( + stderr, "Elf file failed to load : {}.", elf_errmsg(-1)); + fileLoaded = false; + } else { + fileLoaded = true; } - if ((m_name = elf_strptr(m_e, m_shstrndx, m_shdr.sh_name)) == NULL) { - errx(EX_SOFTWARE, "elf_strptr() failed: %s.", elf_errmsg(-1)); + if (fileLoaded && fileOpened) { + if (elf_kind(m_elf) != ELF_K_ELF) { + std::println(stderr, "\{} is not an ELF object. ", m_file); + } + std::println("{} {}-bit ELF object\n", + m_file, + m_elf_class == ELFCLASS32 ? 32 : 64); + loadElfHeader(); + loadSectionHeader(); + loadProgramHeader(); } + }; - if (static_cast(m_name) == section) { - std::println("{} found", static_cast(m_name)); - std::println( - "Section {}: {}", static_cast(elf_ndxscn(m_scn)), m_name); - std::println("===================="); - - m_fbin = open("binary/lsda", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); + ~ElfParser() + { + close(m_fd); + std::println("ELF file closed"); + } - while ((m_data = elf_getdata(m_scn, m_data)) != NULL) { - write(m_fbin, m_data->d_buf, m_data->d_size); - } + void printElfHeader(); + void printSectionHeader(); + void printProgramHeader(); - close(m_fbin); - break; - } - } -} + void getSection(std::string_view const& section); -void ElfParser::closeElf() -{ - close(m_fd); - std::println("ELF file closed"); -} \ No newline at end of file + private: + int m_elf_class; + int m_fd; + std::string m_file; + + Elf* m_elf; + GElf_Ehdr m_elfHeader; + std::vector m_programHeader; + std::unordered_map m_sectionHeader; + + bool elfHeaderLoaded; + bool fileOpened; + bool fileLoaded; + + void loadElfHeader(); + void loadSectionHeader(); + void loadProgramHeader(); +}; diff --git a/src/elf_parser.cpp b/src/elf_parser.cpp new file mode 100644 index 0000000..a178cf6 --- /dev/null +++ b/src/elf_parser.cpp @@ -0,0 +1,132 @@ +#include "../include/elf_parser.hpp" + +void ElfParser::loadElfHeader() +{ + if ((gelf_getehdr(m_elf, &m_elfHeader)) == NULL) { + std::print(stderr, "Elf header failed to load: {}.", elf_errmsg(-1)); + elfHeaderLoaded = false; + } else { + elfHeaderLoaded = true; + } +} + +void ElfParser::loadSectionHeader() +{ + if (!elfHeaderLoaded) { + std::print(stderr, "Elf header was not previously loaded: {}.", elf_errmsg(-1)); + } else { + char* sectionName; + Elf_Scn* scn = nullptr; + GElf_Shdr tempSectionHeader; + while ((scn = elf_nextscn(m_elf, scn)) != NULL) { + if (gelf_getshdr(scn, &tempSectionHeader) != &tempSectionHeader) { + std::print( + stderr, "Unable to get section header: {}.", elf_errmsg(-1)); + } + + if ((sectionName = elf_strptr(m_elf, + m_elfHeader.e_shstrndx, + tempSectionHeader.sh_name)) == NULL) { + std::print( + stderr, "Unable to get section name: {}.", elf_errmsg(-1)); + } + + m_sectionHeader.emplace(sectionName, tempSectionHeader); + } + } +} + +void ElfParser::loadProgramHeader() +{ + if (!elfHeaderLoaded) { + std::print( + stderr, "Elf header was not previously loaded: {}.", elf_errmsg(-1)); + } else { + GElf_Phdr tempProgramHeader; + for (int i = 0; i < m_elfHeader.e_phnum; i++) { + if (gelf_getphdr(m_elf, i, &tempProgramHeader) != + &tempProgramHeader) { + std::print( + stderr, "Unable to get program header: {}.", elf_errmsg(-1)); + } + m_programHeader.emplace_back(tempProgramHeader); + } + } +} + +void ElfParser::printElfHeader() +{ + if (!elfHeaderLoaded) { + std::print( + stderr, "Elf header was not previously loaded: {}.", elf_errmsg(-1)); + } else { + std::println("ELF Header"); + std::println("===================="); + std::print("ident: "); + for (int i = 0; i < 16; i++) { + std::print("0x{:X}, ", m_elfHeader.e_ident[i]); + } + std::println(""); + std::println("type: 0x{:X}", m_elfHeader.e_type); + std::println("machine: 0x{:X}", m_elfHeader.e_machine); + std::println("version: 0x{:X}", m_elfHeader.e_version); + std::println("entry: 0x{:X}", m_elfHeader.e_entry); + std::println("phoff: 0x{:X}", m_elfHeader.e_phoff); + std::println("shoff: 0x{:X}", m_elfHeader.e_shoff); + std::println("flags: 0x{:X}", m_elfHeader.e_flags); + std::println("ehsize: 0x{:X}", m_elfHeader.e_ehsize); + std::println("phentsize: 0x{:X}", m_elfHeader.e_phentsize); + std::println("shentsize: 0x{:X}", m_elfHeader.e_shentsize); + std::println("shnum: 0x{:X}", m_elfHeader.e_shnum); + std::println("phnum: 0x{:X}", m_elfHeader.e_phnum); + } +} + +void ElfParser::printSectionHeader() +{ + if(m_sectionHeader.empty()) + { + std::print(stderr, "No section headers exists."); + } else { + std::println("Section Header: ({})", m_elfHeader.e_shnum); + std::println("===================="); + for(const auto& section : m_sectionHeader) + { + std::println( + "Section: {}", section.first); + std::println(" type : 0x{:X}", section.second.sh_type); + std::println(" flags : 0x{:X}", section.second.sh_flags); + std::println(" addr : 0x{:X}", section.second.sh_addr); + std::println(" offset : 0x{:X}", section.second.sh_offset); + std::println(" size : 0x{:X}", section.second.sh_size); + std::println(" link : 0x{:X}", section.second.sh_link); + std::println(" info : 0x{:X}", section.second.sh_info); + std::println(" addralign : 0x{:X}", section.second.sh_addralign); + std::println(" entsize : 0x{:X}", section.second.sh_entsize); + std::println("===================="); + } + } +} + +void ElfParser::printProgramHeader() +{ + if(m_programHeader.empty()) + { + std::print(stderr, "No program headers exists."); + } else { + for(int i = 0; i < m_elfHeader.e_phnum; i++) + { + std::println("Program Header: {}", i); + std::println("===================="); + std::println("type : 0x{:X}", m_programHeader[i].p_type); + std::println("flags : 0x{:X}", m_programHeader[i].p_flags); + std::println("offset : 0x{:X}", m_programHeader[i].p_offset); + std::println("vaddr : 0x{:X}", m_programHeader[i].p_vaddr); + std::println("paddr : 0x{:X}", m_programHeader[i].p_paddr); + std::println("filez : 0x{:X}", m_programHeader[i].p_filesz); + std::println("memz : 0x{:X}", m_programHeader[i].p_memsz); + std::println("align : 0x{:X}", m_programHeader[i].p_align); + std::println("===================="); + } + } +} diff --git a/src/main.cpp b/src/main.cpp index a271541..a645238 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,23 +1,21 @@ -#include "../include/elf_parser.hpp" #include #include #include -int main(int argc, char** argv) +#include "../include/elf_parser.hpp" +int main(int argc, char* argv[]) { - std::string lsda = ".gcc_except_table"; - std::string symtab = ".symtab"; - if (argc != 2) + //const std::string_view lsda = ".gcc_except_table"; + + if (argc < 2) { - errx(EX_USAGE, "usage : %s file - name ", argv[0]); + std::print(stderr, "usage : %s file - name {}", argv[0]); } - ElfParser elf(argv); - elf.openElf(); - elf.printShdr(); - elf.getSection(lsda); + ElfParser elf(argv[1]); + elf.printElfHeader(); + //elf.printSectionHeader(); + elf.printProgramHeader(); - elf.closeElf(); return 0; - ; } \ No newline at end of file