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}$NWGy$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