From c8d1cae5b2f1ff02480563d2c90a2f8c7b1eaf87 Mon Sep 17 00:00:00 2001 From: "Shang-Wen Wang (Sam Wang)" Date: Mon, 2 May 2022 16:35:03 -0400 Subject: [PATCH] fix: support bpf_core_type_exists() In the previous version, when no target is found in BTF, coreCalculateFixups() will mark its relocation as poison and cause failure when verified by Linux verifier. This issue is fixed by using right fixup for "checksForExistence" type of relocations. Signed-off-by: Shang-Wen Wang (Sam Wang) --- internal/btf/core.go | 10 ++++++++-- internal/btf/testdata/relocs_read-eb.elf | Bin 8992 -> 9472 bytes internal/btf/testdata/relocs_read-el.elf | Bin 8992 -> 9472 bytes internal/btf/testdata/relocs_read.c | 15 +++++++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/internal/btf/core.go b/internal/btf/core.go index c0de82386..2c65b8d51 100644 --- a/internal/btf/core.go +++ b/internal/btf/core.go @@ -315,10 +315,16 @@ func coreCalculateFixups(byteOrder binary.ByteOrder, local Type, targets []Type, if bestFixups == nil { // Nothing at all matched, probably because there are no suitable - // targets at all. Poison everything! + // targets at all. + // + // Poison everything except checksForExistence. bestFixups = make([]COREFixup, len(relos)) for i, relo := range relos { - bestFixups[i] = COREFixup{kind: relo.kind, poison: true} + if relo.kind.checksForExistence() { + bestFixups[i] = COREFixup{kind: relo.kind, local: 1, target: 0} + } else { + bestFixups[i] = COREFixup{kind: relo.kind, poison: true} + } } } diff --git a/internal/btf/testdata/relocs_read-eb.elf b/internal/btf/testdata/relocs_read-eb.elf index a047d207e7f8dcd13c1cfdfd581dd4d4ae2d6087..9445133359cebf64e9fd4a4c81363a44b1de295b 100644 GIT binary patch delta 2098 zcmZ9MUuauZ7{I@CZthLmEG|ovv|(azvZ?8&Ylfp%bhXY-yREbpTMc89Y+Z^0*VVPd z31T8l>BE?9PapaqOyBx2VUULg9PSD}Z79XQ4E7@8gSf%Q=!3`*zwg|0Zg1{KPtW)J z{+#bSU+%r%zEwZIc!1~XONEzXFMPZU7@(x$u(33nNGDNo)V1thaaF8Y&$nFxV7QFSjl0%yc7!)W zXuu@g_)oZVIsyGhEYEI?qd}e&lRkw{^8g3o|MhC#*G0h;75`k4H) zihl*z68ECrwL@feTq_#_CV3;kf3-5Bma#1z&s19;4+s2Z#h(Kk#CmMi4QRGo<9Wa0Ca@7K$knx(=DPORRDkYC2RJ%F`R@k!pH?>XL>>bxVnIVs zKyy*WYt{|bv_UtZ`9>gNBfx4RJPYhB77W?0-{V4nRYRU%HBj>m3xR~S06U7ufz47u zH36>JjI{bqJHWaD9bcCI8h8iP0|{y({4%i5u%M|X;PLM&Ui)=JiY>dH&7HUS0qa9lcVa7daF1ZAy324IcRbQs#2wS5zg>K1+v4d&TI}nL#i$7- zEYTQAj4^Q{5#>BC9;MUb$BxNoe?zxwi#s|N-<^X#ds8fSbc(U$MCRXZt5M&MhTGz1 z@@w%!GAiCneJS=QqfdoaeeTC%D^+5Di-~lvxR;8GtLe#1X8R}$FXhP};t58bz^J~? zFPPJ4c0M$YK0-GQ2fv;qa`Q6{&Chw{S9Ku9_Y*fB>|WtT)KIKH@t-fl+G^!6mGJq) z$pG&S@F8*O8Hc?h4t9UlxYhkSK4V!i%71o geFrs%5*`x6h?%k^z?_9#AGgcG$qn$1`tlz8f6LDt>Hq)$ delta 1618 zcmZ9MUr1AN6vxl+cem@mX;azVR%UlPYDLr_QOghsH8BZ`BJssN^x#8+fp1A$lprLb zoIMx_4tkODL0X{nbPK7M2x%b^K_hyQ3<6&oJ#~Kf{(e_?51ifK=X}rkowMKWZ<)bd z|NI$l<`$A2wa4$)0|T;95Z)~e9jQG@0oy3>W?^a9KX5Y$&v1?vs;V_o1>8en(X9@%u#AWlzm?K63aYCaHGk~fgs ziS*PcZXMttt%Zx63*^EgweS2Y5yC&{iF4jNb4f^IXOO&evsqD;`=MT&BMKd^LLJBIi}1FG-GLgzAgVW*2j4B11z>& zW|Np`ZRh$Lrdqpscnfo_-PO89Wn{il+-YsEu4!^m|A~osdv&-dF^A*vcHW%9T)dk% I02brse~TW?K>z>% diff --git a/internal/btf/testdata/relocs_read-el.elf b/internal/btf/testdata/relocs_read-el.elf index 551e9eb1bbc034e5129abfc42c5bf80aaa99d0ce..4d9c060e42479202413285bfe81fbbbc1707752c 100644 GIT binary patch delta 2106 zcmZ9OUu;uV7{I@C+uqxCGrMeUx2kcsg9bg_wyx{aub zdaEJ2#6K`U9-8=oJecr+$*?3;G+H(B0ix+%jNwU*4>QDogon8pjXUkVxkEPdwV;#NSic~?b^b}e_G>22gGOi zo>*#oTIwG`06!3CF&M~N`=#X-90)A6Jty@;0MdIYn6(Z{%MjiOE?Lh@eItG!S~^^i zdOM^Z8HrsceUipy>V%s)Aj0${rZL6ynmxp3=v6F%9vsIK6P)dF2|qO-jJ!_<9w!5} zpUpjDsBXv=fEqMIS4*>VKuX@z zvd~tVa?(f2Q~Al`GsXPeYvrQnnoZBn&77E=bNsA~licZKGg`t_srb@SKO?Q@IGZxr z%;rIFy%a6&7x9bci_<5L!T7%M{FAw{XZPdH$V2Yg8v-1)j}0{Q;H{@={7c*7Q|_YS zof-gb5{|U&o_)58*-0}?FO5M~&UpFE$7r-ysV>dTAJT|lfF~f^VlXcN>{3iB#OnaL z7B-2?ihrWnx`Wr-``m2;8p=9CeVW8gjh8jHDURFlJwa zz}(PyS!2Fd+<;%u(YRl6o$}1R0?Ha!?y@Tbs&@^N8yf$j@ruSaeW={fZC)@ZU{vFr z#^p73y@cwT!Q(}Zn;I`GPEsT0QM!e6WUB2MF@9s8?kVhu#oT&EPOk)JydWA@wa3* OHdFM^LN~6aHvSKeLmv46 delta 1611 zcmZ9MO=wd=5XWa<(wC1$o3IG_z=ISIrFf|HAQY6~$=Q9I_OU}|cYpt#*&TNGB|BOe zc@onK!CZU4w-o?x)-!4WeC#9SP6g`PgeD}?mU7R3ITA#d*h_rK%C3`QJOws<#AeZM zi#yH;WgG`=W!HHzz5pO*-`V4ii$dwaZF|{qS&W-;rKVg@Lt36e_}H-TJ&nikkAB3R zqFT6bYQ^+M`9Z_|p7spD>^6fS4fAKx|eIggXqW&vWU=_?W^8h54EC_mFKwk1B-|#v;N`*HRt|%PT&4Q}=y$UBy9;I6|?S>3kpbgnA zdW6)|PZ+=3PXwMU6CX8a5jVqjKj5Rq2i_G8C&SJ7qVYgeCp`te0AJQ>?&50WS?1E@ zv==9Q2KM@r>@((k#=$nJ^VO~P4{+Ich3#O-Z?I+T^G~xyT=h@8LNXzbONN2BjU?N| zveAL5fD@g8B&)}(0fVjMoj?bBi?0IrS-RNS^xJlt|4DJ9i-ZAkCm)biIcj0PN0-9G zRxXYoLJd>F1q_BVT3=W3Y3Ml9CR%VkJi^i#iu7pnI*vsKwKW5uMF!m^c`Rdg+>CU) nn`_11@KeWdwA;O5m{`#9TC}?++d_y-kw%=4#x!Wa^=RvV1{BQ% diff --git a/internal/btf/testdata/relocs_read.c b/internal/btf/testdata/relocs_read.c index ac19b7ab9..7b07cb6f6 100644 --- a/internal/btf/testdata/relocs_read.c +++ b/internal/btf/testdata/relocs_read.c @@ -26,6 +26,12 @@ struct bits { u64 f : 16, g : 30; }; +struct nonexist { + int non_exist; +}; + +enum nonexist_enum { NON_EXIST = 1 }; + // Perform a read from a subprog to ensure CO-RE relocations // occurring there are tracked and executed in the final linked program. __attribute__((noinline)) int read_subprog() { @@ -89,6 +95,15 @@ __attribute__((noinline)) int read_subprog() { if (BPF_CORE_READ_BITFIELD(&bar, g) != 0x15443322) return __LINE__; + if (bpf_core_type_exists(struct nonexist) != 0) + return __LINE__; + + if (bpf_core_field_exists(((struct nonexist *)0)->non_exist) != 0) + return __LINE__; + + if (bpf_core_enum_value_exists(enum nonexist_enum, NON_EXIST) != 0) + return __LINE__; + return 0; }