From patchwork Wed Sep 8 20:14:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 45870 From: mark@klomp.org (Mark Wielaard) Date: Wed, 8 Sep 2021 22:14:02 +0200 Subject: [PATCH] libdw: set address size, offset size and version on fake CUs Message-ID: <20210908201402.38174-1-mark@klomp.org> There are three "fake CUs" that are associated with .debug_loc, .debug_loclist and .debug_addr. These fake CUs are used for "fake attributes" to provide values that are stored in these sections instead of in the .debug_info section. These fake CUs didn't have the address size, offset size and DWARF version set. This meant that values that depended on those properties might not be interpreted correctly. One example was the value associated with a DW_OP_addrx (which comes from the .debug_addr section). Add a testcase using varlocs to test that addresses can correctly be retrieved for gcc/clang, DWARF4/5 and 32/64 bits objects. https://sourceware.org/bugzilla/show_bug.cgi?id=28220 Signed-off-by: Mark Wielaard --- libdw/dwarf_begin_elf.c | 32 ++++++-- tests/Makefile.am | 13 ++- tests/run-varlocs-vars.sh | 93 ++++++++++++++++++++++ tests/testfile-vars-clang-dwarf4-32.o.bz2 | Bin 0 -> 568 bytes tests/testfile-vars-clang-dwarf4-64.o.bz2 | Bin 0 -> 605 bytes tests/testfile-vars-clang-dwarf5-32.o.bz2 | Bin 0 -> 741 bytes tests/testfile-vars-clang-dwarf5-64.o.bz2 | Bin 0 -> 761 bytes tests/testfile-vars-gcc-dwarf4-32.o.bz2 | Bin 0 -> 660 bytes tests/testfile-vars-gcc-dwarf4-64.o.bz2 | Bin 0 -> 691 bytes tests/testfile-vars-gcc-dwarf5-32.o.bz2 | Bin 0 -> 728 bytes tests/testfile-vars-gcc-dwarf5-64.o.bz2 | Bin 0 -> 768 bytes 11 files changed, 130 insertions(+), 8 deletions(-) create mode 100755 tests/run-varlocs-vars.sh create mode 100644 tests/testfile-vars-clang-dwarf4-32.o.bz2 create mode 100644 tests/testfile-vars-clang-dwarf4-64.o.bz2 create mode 100644 tests/testfile-vars-clang-dwarf5-32.o.bz2 create mode 100644 tests/testfile-vars-clang-dwarf5-64.o.bz2 create mode 100644 tests/testfile-vars-gcc-dwarf4-32.o.bz2 create mode 100644 tests/testfile-vars-gcc-dwarf4-64.o.bz2 create mode 100644 tests/testfile-vars-gcc-dwarf5-32.o.bz2 create mode 100644 tests/testfile-vars-gcc-dwarf5-64.o.bz2 GIT binary patch literal 768 zcmV+b1ONO&T4*^jL0KkKSwuCE8vp{`fBpae`Tq9z_xtPpQh>kj-{^n{6aWN301!|B zP(UC^zyfOFMpXm~DYmHnQ%wdmo~Dfr4KRRc(WXE!5s+X^k5CysG@58M5j38HX+0V# z<4R;S(WcOY1R6ACF$_%_7zoj|GHBBr001-%4Gj%405kvrpc)zg0Av6FktIDwDtW3I zq|u@3Gz~P-`lCjMKmY^OGzX|OG-zmPkb_W*jZkIAF%S^~#$&G~RhT@Kzs_Sm3_ZK4 z=y;F@nEQa*5MqL}HFaBReR?UqTD6>ScXPvI*O8f_`>z?W=P}r^IjJ-qurN!Z8 z-nrVh7c&SHkd-{>hJsFtAWBbi=BiPc(j?M3tt1_0l1XA{!<~~MV>3bPzq=;wxL|f# z2{gPc0IpDgY-~z~LqOU`d59sln@H?5D;ik-?Q7c6sHN+m$oMXiV1Q0A67T7__;s}b zxkC6>e5FDn0CXbRm~axq4gDA#lNjSJR15aaX6@<~u+lYa0o%RTA z3y$%x?9S3sXfNE)l2$abGGP}b5XQ#a27!c{M=yH_K09ayOI_B#*s4`95Hq(55}6Q$ zz=!bVu#g!WxS`#1;6X6Ns5q_+-CO9KJ|U_(eS&xK&m~r_KG{4!3KuY7`8Wq^0MIoyrsj#tK<)WK(sBu+KrBGExwf#0dxgs9nhv;X*+W)kzU0B literal 0 HcmV?d00001 diff --git a/libdw/dwarf_begin_elf.c b/libdw/dwarf_begin_elf.c index 9e944b86..a368feb8 100644 --- a/libdw/dwarf_begin_elf.c +++ b/libdw/dwarf_begin_elf.c @@ -224,6 +224,23 @@ valid_p (Dwarf *result) result = NULL; } + /* We are setting up some "fake" CUs, which need an address size. + Check the ELF class to come up with something reasonable. */ + int elf_addr_size = 8; + if (result != NULL) + { + GElf_Ehdr ehdr; + if (gelf_getehdr (result->elf, &ehdr) == NULL) + { + Dwarf_Sig8_Hash_free (&result->sig8_hash); + __libdw_seterrno (DWARF_E_INVALID_ELF); + free (result); + result = NULL; + } + else if (ehdr.e_ident[EI_CLASS] == ELFCLASS32) + elf_addr_size = 4; + } + /* For dwarf_location_attr () we need a "fake" CU to indicate where the "fake" attribute data comes from. This is a block inside the .debug_loc or .debug_loclists section. */ @@ -247,8 +264,9 @@ valid_p (Dwarf *result) = (result->sectiondata[IDX_debug_loc]->d_buf + result->sectiondata[IDX_debug_loc]->d_size); result->fake_loc_cu->locs = NULL; - result->fake_loc_cu->address_size = 0; - result->fake_loc_cu->version = 0; + result->fake_loc_cu->address_size = elf_addr_size; + result->fake_loc_cu->offset_size = 4; + result->fake_loc_cu->version = 4; result->fake_loc_cu->split = NULL; } } @@ -274,8 +292,9 @@ valid_p (Dwarf *result) = (result->sectiondata[IDX_debug_loclists]->d_buf + result->sectiondata[IDX_debug_loclists]->d_size); result->fake_loclists_cu->locs = NULL; - result->fake_loclists_cu->address_size = 0; - result->fake_loclists_cu->version = 0; + result->fake_loclists_cu->address_size = elf_addr_size; + result->fake_loclists_cu->offset_size = 4; + result->fake_loclists_cu->version = 5; result->fake_loclists_cu->split = NULL; } } @@ -306,8 +325,9 @@ valid_p (Dwarf *result) = (result->sectiondata[IDX_debug_addr]->d_buf + result->sectiondata[IDX_debug_addr]->d_size); result->fake_addr_cu->locs = NULL; - result->fake_addr_cu->address_size = 0; - result->fake_addr_cu->version = 0; + result->fake_addr_cu->address_size = elf_addr_size; + result->fake_addr_cu->offset_size = 4; + result->fake_addr_cu->version = 5; result->fake_addr_cu->split = NULL; } } diff --git a/tests/Makefile.am b/tests/Makefile.am index c586422e..22942733 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -143,7 +143,7 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \ run-dwfl-report-elf-align.sh run-addr2line-test.sh \ run-addr2line-i-test.sh run-addr2line-i-lex-test.sh \ run-addr2line-i-demangle-test.sh run-addr2line-alt-debugpath.sh \ - run-varlocs.sh run-exprlocs.sh run-funcretval.sh \ + run-varlocs.sh run-exprlocs.sh run-varlocs-vars.sh run-funcretval.sh \ run-backtrace-native.sh run-backtrace-data.sh run-backtrace-dwarf.sh \ run-backtrace-native-biarch.sh run-backtrace-native-core.sh \ run-backtrace-native-core-biarch.sh run-backtrace-core-x86_64.sh \ @@ -399,7 +399,16 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ testfileppc32.bz2 testfileppc64.bz2 \ testfiles390.bz2 testfiles390x.bz2 \ testfilearm.bz2 testfileaarch64.bz2 \ - run-varlocs.sh run-exprlocs.sh testfile-stridex.bz2 \ + run-varlocs.sh run-exprlocs.sh run-varlocs-vars.sh \ + testfile-vars-clang-dwarf4-32.o.bz2 \ + testfile-vars-clang-dwarf4-64.o.bz2 \ + testfile-vars-clang-dwarf5-32.o.bz2 \ + testfile-vars-clang-dwarf5-64.o.bz2 \ + testfile-vars-gcc-dwarf4-32.o.bz2 \ + testfile-vars-gcc-dwarf4-64.o.bz2 \ + testfile-vars-gcc-dwarf5-32.o.bz2 \ + testfile-vars-gcc-dwarf5-64.o.bz2 \ + testfile-stridex.bz2 \ testfile_const_type.c testfile_const_type.bz2 \ testfile_implicit_pointer.c testfile_implicit_pointer.bz2 \ testfile_parameter_ref.c testfile_parameter_ref.bz2 \ diff --git a/tests/run-varlocs-vars.sh b/tests/run-varlocs-vars.sh new file mode 100755 index 00000000..e7598bf0 --- /dev/null +++ b/tests/run-varlocs-vars.sh @@ -0,0 +1,93 @@ +#! /bin/sh +# Copyright (C) 2013, 2021 Red Hat, Inc. +# This file is part of elfutils. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# elfutils is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. $srcdir/test-subr.sh + +# Testfiles generated with: +# +# $ cat foo.c +# int x = 1; +# int y = 2; +# +# for cc in gcc clang; do +# for v in 4 5; do +# for w in 32 64; do +# out="testfile-vars-$cc-dwarf$v-$w.o" +# "$cc" -m"$w" -Wall -Wextra -gdwarf-"$v" -c foo.c -o "$out" +# done +# done +# done + +testfiles testfile-vars-clang-dwarf4-32.o +testfiles testfile-vars-clang-dwarf4-64.o +testfiles testfile-vars-clang-dwarf5-32.o +testfiles testfile-vars-clang-dwarf5-64.o +testfiles testfile-vars-gcc-dwarf4-32.o +testfiles testfile-vars-gcc-dwarf4-64.o +testfiles testfile-vars-gcc-dwarf5-32.o +testfiles testfile-vars-gcc-dwarf5-64.o + +tempfiles varlocs.out +testrun ${abs_top_builddir}/tests/varlocs --debug --exprlocs -e testfile-vars-clang-dwarf4-32.o | grep exprloc > varlocs.out +diff -u varlocs.out - < varlocs.out +diff -u varlocs.out - < varlocs.out +diff -u varlocs.out - < varlocs.out +diff -u varlocs.out - < varlocs.out +diff -u varlocs.out - < varlocs.out +diff -u varlocs.out - < varlocs.out +diff -u varlocs.out - < varlocs.out +diff -u varlocs.out - <}MAT4*^jL0KkKS%dA}XaE7y|H=RVdH&z;{J)RqLI}U_-(tu>L;wH)pa{SL z)!lYwkrZhF01W}4&<2eFXc_=$003lY0i`yHqMpiR(?*~G4^RLA$)E#302)0_83Rm` znL|dJ0MVv~fB*m)0002>0BNAmN@^+UXqf;s0MGyrPylFTXaEL=Kr{#RVOlA4P(oBw zT_yCAvw@uZ&rP?VA6p+NToQjnO*EqEu~(txUmW7EHc*&NItcKjm}z!QTy^4z4(!Ah zg~)&yGY$h{Q1l_!Qr-@t=Kx|!c3KXU_E5}qKgrngTE4YO`&Fg`M3`f3GgB-8Y2}8A zCea}hL9WsShpJOVK!c=NsS=r(-9(B5nw9H-B22;%%p}D$1k`b+!9@Ocs~wt?)m^8- zxI`ne)+SxXm=Oo7fh>li78DQ&BHm-)7@9=LvjRl&6u;LF!q{=pS31n%K{mz0s75>_ zNFR)LlVvuL+7Y8fX^Eo)K$>L4 zFiarC(@acFFrI^khK!mtXwyR@A%p>t10d5t01SbU1c?xUBPpXts4=J*gVYQldQ43W zgGZ*LMuCKyK`KKDA|URB*H(qjZlpPpZNkl3Ve3{Sy(3JyD)O2tq$-pU!G|Tg(leH% zmtb||QJ`o`PgznZ5L4$i(vE3!E@YwT^2ee^$>vP7ef5hRk}X9Tn{@lji{ z;26<-VgsuvL_pwa?0#Vc+DD;+4K|P?{L$2+5$SEDv9KFRH#Ok_X^o*afwUt@pbY+V zi_Ma!1u3-`T-*RYNH2-=>CEcr+HxvV!VD*xm;o>swz6A(?5n zAyZU4@U$4K*ea4iX`~I?a>W5QNvSn9A=!lPM1XWLZnYR;WNB*a#ZS8aT+`uX&``^4 zso8V-JZHtY2fkwN_yw-uPjUvLh2#M-_k{Mi8gtP)PvLUXRgp9VSAkSqjMsSb{iu~GF*-G!nE;K>!PO>-A=ML1B9iMNqA2RRz= literal 0 HcmV?d00001 diff --git a/tests/testfile-vars-clang-dwarf5-32.o.bz2 b/tests/testfile-vars-clang-dwarf5-32.o.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..b1d6b6c436bafbd4cc0c18b33e77d1a273e29c43 GIT binary patch literal 741 zcmVOLe226l@Pf$HZKn*ki27#ae14e2Z4@fkPO#+?-o{XRX z1JnQj&;S|$0002U0l)w>05k!h00TxK0B8UJ003wJks_HiCYnP)#Aq;qlT1xCX`>+Z z8UO*IwG9T1Gyt`rHTu$_dWIRAZX0Y}A-5D{vI$8_XxT@CzD`BtZ+bZz2?z%i+e)z` zF&;}Xx97(jw*9``xfLCz_RZ8nuNra{hmM#|JuYOqxocaERBcQcSJH@uBOns?;mhU9 zvze^h%`|Kn0G&mEobhNsG*@GEEZp2e=HsH$*6Zh8*ryvG^(wp8V-DZKQxG-+)nYPO zkg;%K0a?X}B`ji1iZonl#7{;FFQ6vClR(@srIK*aW<5rWEJqonTxB_A2jQabG$B{B z2}1%HgxDs~*uK@}B%4dPV35eB_doASjFcX*wbuHfkw`F8%nEc-EDp(tXhjNzjmTO! zGNCVBWdOQW^($^x;Jiwf#FPw2nSmCuWh=0GEKfsbiVOO;a?fUET(6wenU|Fe7%k-x zg4Oo-~x9r)8Jj}fL zQu|KBFl>-}jkDBe6TUC$g?ePQZlCHcX%S8FwH=V(2SZ6sT1<41gH4N%ujK;qfEB3? zGYa7TC1Gph+Lr;GnGk+1e2 zu|_7k9S2&LgMd`2(4f0g6~n~Pk7?mC_GE#YK)`+yBuXT78Unu(Dv?%@fhmMgl&`oM X48W&gfsE>*@9}peQ-ui&=e$KgnQlgt literal 0 HcmV?d00001 diff --git a/tests/testfile-vars-clang-dwarf5-64.o.bz2 b/tests/testfile-vars-clang-dwarf5-64.o.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..adf6c6a532b5902f0a911d7f6b092e211efc420f GIT binary patch literal 761 zcmVY?$N``<44J4NkZNcnMA}noJx!!! z4Kx4%&>8>$0000000F=N0000082|tP000000gwPlktRZ(n3GKdO&J;nnrJl841u5l zplE1lGy$iiWCG@dq$Ex`!5N@Q2RIP7^9!ph!c(OnsGE~2qMlt{jfO`psF!V&MhoTp zo_|T%E8s*T6f3~u9sF3e7M#S387}SMPY zYAJO>LTx2fp$0T3lGMFz3T-8v#0w>eNoKTXx)`w@b5|Nc(rK|8jR1DD;UeQhXhUEX zn`8|kS8&ozpviwGP5d-x`FYE^K&Z0~y$;|S2?h7hSG^A2CCad=H>L4Inq_$Ay)%~R z2Et6ztkeS*>kgc^G{&76vL$l+`8A};yZ3z3*Q(5m+TXc0xDN)}AW0WpOhh}n@oOFd zQA8=RP2BZWBr9~o8cn3ZGE~A1Hb)K@MWkgsroX+&uFMRlPVr7j!wAClpbo+u{fR+c z+{sEom?CO#c^hML1B9!>A_ppSe^; literal 0 HcmV?d00001 diff --git a/tests/testfile-vars-gcc-dwarf4-32.o.bz2 b/tests/testfile-vars-gcc-dwarf4-32.o.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..da9aac73829eb036dad242af38c027e50259f70d GIT binary patch literal 660 zcmV;F0&D$3T4*^jL0KkKSt97HBme?4f7Sp0?&@ym{r~Ir5)%LK-{Rl`1O$M9Kmi~K zzydVliqwXtiG@Qo8){8FqaXm$My6?{89!9@HlPMT^#ec# zfB*mh27r2lfuLvxfuW!SLm{Ss8fXT90LWqh4FrgyG-(q}JwOai4^vG5&>CVH8UV;1 zkTk?J^w2p8(TBW*t>Og;Eg(UHIie&@(3c9OjoG&CC>euDNJIEeiIW?B1PNpMu=YPA zmAN6!kGfFAh>bKv+AzJ4u?@&MP=SsZz;97<{(Q6NuAsVN05GAFu!>bU&|qqG>bBj& zh$HUXpG>?8y*k&Y4JAOE5NEU<<{@%7VI*2;2F{C0wwr9W%S@%NYdlPrIwQ8h=fD-c z*Kvtb^2TPcnxSN|1hj_F96~~Fwh9>8r4THl+aLt;1Hax>mSac4BMc%jg`y8UaQx$$ z)YXb{5denROG1N>AZTE{H7oEC)yEAd&Vm?kdOx#;)1w9}tn0wKnTR1>ZHO#7n6cc< zvQz0}NJ|i?WH@Mqz&1V6e*L@jD=j|^aBBRnP!zajiP@7S<2w;44(y8cvb;~_NLLbB z4Z$g{oaeA*oR*wWfoVV`Qou+%^WaTp3`K0N$z=Q<(U1~WAHAAFO@itF$gCJC^|A1Z zAeOAwMGB?|eJ2qh6kql{{{$6ecoxe73o?U5+xD;_@oxqP>5Ps125+!ES9yqQD%~?c z#fyg#+C~zhoJ5h-CydjWDo%>rRM7q_vR+k~B7ip?yr^_8O#_XfAr={3=M3#5gbY4x{;9(q91pIgk8xL;X*)*qOgz}W+?{% literal 0 HcmV?d00001 diff --git a/tests/testfile-vars-gcc-dwarf4-64.o.bz2 b/tests/testfile-vars-gcc-dwarf4-64.o.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..26421644423ae556ae4b968cda93ceab1ffe0403 GIT binary patch literal 691 zcmV;k0!;lvT4*^jL0KkKS??NpH2?y7|Mma>`u=X`_5087QiQ+n-{61%f(SrBNB{@` zU8X`<1O*GR;#*;y#)EWR}$N&#WGy$VP%%(sZAb?LrJc;UP!~v(Npa3)g z000Jn0MIxZ27qW98UQph8fXEgfM@^=h9CgYNRl*)V^a~6XhDJoMwv9hFq&vFG7N{L zJxw&zCLqETt7qLv%NZCj{e{X%zS9iP$+u&N>ep_?RiT|+z^^DEfHw2pP=Oay z_P4g!R8BH9B5f9M@TZMQ3dsl+XP)7tPQ(da&_#2(Ng)(8FFO)hO(Y9JhT9B%C>87F z(}Y=baKPkZlNYU^U0FgCZHYDvX&Vdz7;7{h76=KRH>2H#;$KaIl^jnpBZhR=sK(H{ zf}LT873NF^W&=cD*n@G@HL&Y;oF>~P+k#J_qwOdUa|_nDIy{+02*|iW2*7uZA+QS< zcoa~Snk-&b;)(^}XeT&`f*8hzDyfi+p2Pua)a0!(TrpQOBdPw>-<=>6O}dc7AWE*) z1AM`qhOHYwR5k?LQy~^Hg>mcbB)Ninm%U%sD^Uj}xrH@b35JJXMKz{0vR)Ha6&GFO zc3EPzW6Y*goW9l0M&TJ}a^&B7Fa;6m_~%kZ(H0>OIh|wdxjRND81sEs{&i zFd`+w*T_G{46UC!DSq4)8mb2c3WN;5A6irl6D+XaA!Ilf#i1=4V;aAtCi7lrGm^`W zx?(`5gjo@FDp;IEvY|O{l;jj}KBU ZORZ5&=^79M>i>U>xgwk>NOz4r8i1Ij%|Nq@ znptf=9c>5@n@TAq7B#g^fQg6J*=JY#WT^c!opE8;rv4l(obu_{rxlS%a)o zx)6_NNjfnRtg=idkUQp#&1*qwz?f-QrVVSRfUc5~T85y>1j}KAGX)?VR}cdVxDQ-8 zhke?B?#51ntD(D9%(e1PK>+znzyFNJj25PKpNCp>mcEKuk+E~j3{Slq&+a1sggg69 zfS6@lqEi_Y)gCa|DuO97<|!f?J_qP4j|I`*Mz91j;y_3ptaLv)@y5AO8;2@Vl7nDJ zP!eMZ!LZp@skMky#ytQ_b8?xuQJ^oydT?MJfFwwe#*SF4(d(R2RD~fzsd1=(i@744 KC`d^|wy}V6)i!Sc literal 0 HcmV?d00001 diff --git a/tests/testfile-vars-gcc-dwarf5-64.o.bz2 b/tests/testfile-vars-gcc-dwarf5-64.o.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e286f8f7519be11238a332cd5617b2b7cdd27e8d