This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] libdwfl: Fix and test aux_sym address_sync with relocated ELF


The aux_sym address_sync already worked with a full prelink, which has
.gnu.prelink_undo, but it failed on plain relocations with prelink -r.

Now it uses the difference in ehdr.e_entry as a first offset guess, and
the tests confirm this seems to work fine.

Signed-off-by: Josh Stone <jistone@redhat.com>
---
 libdwfl/ChangeLog              |   5 +++++
 libdwfl/dwfl_module_getdwarf.c |  45 ++++++++++++++++++++++++++++-------------
 tests/ChangeLog                |   7 +++++++
 tests/Makefile.am              |   1 +
 tests/run-dwflsyms.sh          |  10 +++++++++
 tests/testfilebazdbg_plr.bz2   | Bin 0 -> 2241 bytes
 tests/testfilebazmin_plr.bz2   | Bin 0 -> 3337 bytes
 7 files changed, 54 insertions(+), 14 deletions(-)
 create mode 100755 tests/testfilebazdbg_plr.bz2
 create mode 100755 tests/testfilebazmin_plr.bz2

diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 9901380..ca328de 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-18  Josh Stone  <jistone@redhat.com>
+
+	* dwfl_module_getdwarf.c (find_aux_address_sync): New function.
+	(find_aux_sym): Use it.
+
 2013-11-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
 	Code cleanup: Remove const in prototype
diff --git a/libdwfl/dwfl_module_getdwarf.c b/libdwfl/dwfl_module_getdwarf.c
index 7a65ec3..dd76f25 100644
--- a/libdwfl/dwfl_module_getdwarf.c
+++ b/libdwfl/dwfl_module_getdwarf.c
@@ -816,6 +816,33 @@ find_dynsym (Dwfl_Module *mod)
     }
 }
 
+
+#if USE_LZMA
+/* Try to find the offset between the main file and .gnu_debugdata.  */
+static bool
+find_aux_address_sync (Dwfl_Module *mod)
+{
+  /* Don't trust the phdrs in the minisymtab elf file to be setup correctly.
+     The address_sync is equal to the main file it is embedded in at first.  */
+  mod->aux_sym.address_sync = mod->main.address_sync;
+
+  /* Adjust address_sync for the difference in entry addresses, attempting to
+     account for ELF relocation changes after aux was split.  */
+  GElf_Ehdr ehdr_main, ehdr_aux;
+  if (unlikely (gelf_getehdr (mod->main.elf, &ehdr_main) == NULL)
+      || unlikely (gelf_getehdr (mod->aux_sym.elf, &ehdr_aux) == NULL))
+    return false;
+  mod->aux_sym.address_sync += ehdr_aux.e_entry - ehdr_main.e_entry;
+
+  /* The shdrs are setup OK to make find_prelink_address_sync () do the right
+     thing, which is possibly more reliable, but it needs .gnu.prelink_undo.  */
+  if (mod->aux_sym.address_sync != 0)
+    return find_prelink_address_sync (mod, &mod->aux_sym) == DWFL_E_NOERROR;
+
+  return true;
+}
+#endif
+
 /* Try to find the auxiliary symbol table embedded in the main elf file
    section .gnu_debugdata.  Only matters if the symbol information comes
    from the main file dynsym.  No harm done if not found.  */
@@ -879,21 +906,11 @@ find_aux_sym (Dwfl_Module *mod __attribute__ ((unused)),
 	      mod->aux_sym.elf->flags |= ELF_F_MALLOCED;
 	      if (open_elf (mod, &mod->aux_sym) != DWFL_E_NOERROR)
 		return;
-	      /* Don't trust the phdrs in the minisymtab elf file to be
-		 setup correctly.  The address_sync is equal to the main
-		 file it is embedded in at first.  The shdrs are setup
-		 OK to make find_prelink_address_sync () do the right
-		 thing if necessary though.  */
-	      mod->aux_sym.address_sync = mod->main.address_sync;
-	      if (mod->aux_sym.address_sync != 0)
+	      if (! find_aux_address_sync (mod))
 		{
-		  error = find_prelink_address_sync (mod, &mod->aux_sym);
-		  if (error != DWFL_E_NOERROR)
-		    {
-		      elf_end (mod->aux_sym.elf);
-		      mod->aux_sym.elf = NULL;
-		      return;
-		    }
+		  elf_end (mod->aux_sym.elf);
+		  mod->aux_sym.elf = NULL;
+		  return;
 		}
 
 	      /* So far, so good. Get minisymtab table data and cache it. */
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 9461287..9a8ac61 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,10 @@
+2013-11-18  Josh Stone  <jistone@redhat.com>
+
+	* testfilebazdbg_plr.bz2: New testfile.
+	* testfilebazmin_plr.bz2: Likewise.
+	* Makefile.am (EXTRA_DIST): Add the above files.
+	* run-dwflsyms.sh: Add prelink -r tests.
+
 2013-11-15  Mark Wielaard  <mjw@redhat.com>
 
 	* testfilebazmdb.bz2: Regenerated.
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e9cf950..4f8e9e4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -190,6 +190,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \
 	     testfilebazmin.bz2 testfilebazdbg.debug.bz2 testfilebazmdb.bz2 \
 	     testfilebaztab.bz2 testfilebasmin.bz2 \
 	     testfilebazdbg_pl.bz2 testfilebazmin_pl.bz2 \
+	     testfilebazdbg_plr.bz2 testfilebazmin_plr.bz2 \
 	     run-dwflsyms.sh \
 	     run-unstrip-n.sh testcore-rtlib.bz2 testcore-rtlib-ppc.bz2 \
 	     run-low_high_pc.sh testfile_low_high_pc.bz2 \
diff --git a/tests/run-dwflsyms.sh b/tests/run-dwflsyms.sh
index a425277..2adec5a 100755
--- a/tests/run-dwflsyms.sh
+++ b/tests/run-dwflsyms.sh
@@ -19,14 +19,18 @@
 
 # Tests dwfl_module_{addrsym,getsym,relocate_address}
 # See run-readelf-s.sh for how to generate test binaries.
+# In addition, *_pl files were created from their base file
+# with prelink -N, and *_plr with prelink -r 0x4200000000.
 
 testfiles testfilebaztab
 testfiles testfilebazdbg testfilebazdbg.debug
 testfiles testfilebazdbg_pl
+testfiles testfilebazdbg_plr
 testfiles testfilebazdyn
 testfiles testfilebazmdb
 testfiles testfilebazmin
 testfiles testfilebazmin_pl
+testfiles testfilebazmin_plr
 testfiles testfilebasmin
 
 tempfiles testfile.dynsym.in testfile.symtab.in testfile.minsym.in dwflsyms.out
@@ -328,6 +332,9 @@ cat testfile.symtab.in \
 cat testfile.symtab_pl.in \
   | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbg_pl
 
+sed s/0x3000/0x4200/g testfile.symtab_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdbg_plr
+
 cat testfile.dynsym.in \
   | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazdyn
 
@@ -340,6 +347,9 @@ cat testfile.minsym.in \
 cat testfile.minsym_pl.in \
   | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmin_pl
 
+sed s/0x3000/0x4200/g testfile.minsym_pl.in \
+  | testrun_compare ${abs_builddir}/dwflsyms -e testfilebazmin_plr
+
 testrun_compare ${abs_builddir}/dwflsyms -e testfilebasmin <<\EOF
    0: NOTYPE	LOCAL	 (0) 0
    1: FUNC	LOCAL	foo (18) 0x400168, rel: 0x400168
diff --git a/tests/testfilebazdbg_plr.bz2 b/tests/testfilebazdbg_plr.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..1bc43dd22ae2de4bf41a915ea2d900beec559a7b
GIT binary patch
literal 2241
zcmV;y2tM~hT4*^jL0KkKS-Tly%>V~)fB*mg{{H^||8M{I{@4Hi|MvfH)mKFFhYNrI
z_k7-de{bLi7ge&pmcfy!I^8Qe6xMCwsiFc#B=pE>lT#4%LneWmOpOmoqfAUALrf=;
z2dL4bO$JRg13>gcAT%@p02&$@G-Nb1(U59oGA60|0F9wf1fC%tkk9}$9-wFd01TQm
z8UO%j00Te(008v>00w{tga8(a)_nluALO&T%)$)L~x(WXGi0077|X`llj8Vwp54Kf&+
z2AVVhp`bKq00gFpK>#VV0va^XPgMOTr=)(V>S^jdPe}5Ho}s6ddQGSrG->KTR5CQk
zdWN2+hJ(}qX`pCmX!QZ6)C~XtJwXAWXa;~94Ky+UX`zB>G&CAw27t&7F#rLO00E!_
z2*4l!$Ql3u01`<Q)73qSo}e`K000dDVg^6}0000000w{n4FCWJfB*mh0B8!)QF<el
z3SBjQQuSr4YL^^Z(a)b$Rl{Q(a)WuP8x!t2u>2ggCs|t6dEe4ZA`wl{_cdc%k~rGmb_QT
z>~dL57VE`u{vT-hmu_q7%v}wWO*nwT%qn6!HrojehK-Y5XS9?mmZ~yKDsuucb8U%P
ziuf|FPkJ5Pd=%W$b(a)BEqFIHKtv6qRTUPqHwqeBIjl+oPqtB#p*?n;jk>LkPgV>1rl
z98yX_Ai)RF-6){Yn710>iovs*#Ew{`0S4+J{ns`*mIqsv@$_E(phYxx;uJh+V0gDD
zCdX7}(797HF*{cqh~(9A_V|^IFw&=g<8H8Esb6%MRb5czA|g8E8;OchJDsMin|nc-
z>fkumUHlsrPb;^(Ow1i*rE${z5sWk~xz{;$)RM?r_or^*8Z5XH=R|oPiiOJ<+eQms
zu8IOQ(ucmAMIIGRbmTmZ#r;V1(;n1+ikzw3nE0TL^X2heIa$sjfyq`{77G)h*1kw#
z;k3*-QM!rX5q)7KkU)WihGFWn4w_OT^z-4~aY(a)Pvl|4derBMVYc!cVuN2$hc5(a)95U
z7_kEhFdI%5L7fgyF+xak6YP+LW|;~G0G7a!o?r!kOa({-8fe4-c2T4ZGa!v`;kLCz
z856&AS8Z=>kd>v_uLcV>V1<p1vNY3kxjU}DO~0G5ri92z353E-kjN03B$*~;hC&b_
zCP^U(V#E#wf*sw#3dCagw|l%f`Hzb3&9_-iGhR$XA-AY*dKe%>P(w7~&a<iTzuUrm
z+h}dMdnog=pqLV3X!0qwcDySj!D?t)=gH>4Ts(a)yuk6**-X+(Mt9(=oawrn62JN2$p
z=VgynqmDNy)TiHyWo{_kEwcz+1i(a)5pPa)l=KvvmF?>g&ta3N5#RuAitx~w2STUcRF
zl81nB^y7i13J?;bvwh9p`g2ocr6jsB-2E;^k<98jxs(4NHO$^&x;90LLKywisaEy)
zx24guz_-jct>|q8HQ)4g5_tBEa9r<DbkjGjw)t?BAsr`YOr#QccJnT7{m&h+mi?DQ
z+is_gy7k_#F8d1_O-rx7DBR4QsJ{_Hc6^%(V}OLEJFhrUI5o$xScnHi#Ei_{@&Y0L
z|B0#C9A1{sE1keXwT}(8qN-8Tq2bypl#VjbOTKD4j4AyBk2FWBWm|@m?%=^})vG4Z
zjKc!~SlQXo(4$6#;Clfer6ko54?O~I6-l>*X=q2pVTmJF%_w5l6ryBQN#%@Awbx4|
zVEX19Q_)ns<_?#uj>)M=5Sh0dE|{%0nKDds{qjA&aAu0O6DMRQaXJ`@Hf0=z4(XAS
zPZ5u4Taz<AXJjum(~72o?xd)amBwV51rVW(o9C(e3H2eK?4ygQcKlDLVpkiu=!?3=
zl^%1uc4;A`hR~4aiaLD<p&DC~Lz~xqC;6(a)3*_Laz<X5boRb$tADO50J40DH56z=E~
zzFCU$1QU?jkSRR+6Nf5FQ;8(pFuqTAQ0fK=bdO1WM8ZOWkOiT!O&Z^A=!HUIGRBa;
zS|B`nsg_=G2elI7!)To41wBL816oRe;FGmwPq2myf(pknszDR998;)$>0QHQY(a)J3-
zj?_Fw9YS!eW;WNAadcISH{?jMe*H^afQX!%_C+*$j|9`%Sb(a)-FXG?L2Jfz8Fv$?!8
z#YQ<%(0XZ-W-(a)0{d&DqEMyOUnyXczzn*n`PaAL7iq!mt;L9az<P0|i!?iRT{w&&>7
z-Ke`Yz!%T6SXYTQ8vAge&dI6xa^*o(&RyA$)un;s(XwVw7AC*E-eWI&3=hFqjK>VM
zO<XRLjj>-tG_Xw-p+z7(a)F<p?hm?fBGh=%Dn`LiTePMbvy3$*13=ShA-k$|Pue9=2q
zqQ;gR*|^YLxT;FwwAQpq{$E{-RMj!JTfO}m!@XD<{!DeA0pQY2NZ;Co_h5!>WQUsz
zZpN}~qrsn=P|YW^Y02JixOnk4nPBl-50FA?_AyBkokBDSt+BOOJcZ%*{5`Q&a=oRi
z(Cn8gTfN<t*s+4$WowN=+YPy4uYaHYhLte5goCnsv}jhhPA0#J72FW=hz9{^T6-Hi
z>k>oGl~rY1$bgFeVTIA|SZc`M!yMMqmkCSLq$NAL(mNje`<=PWCIy4|p4S}ObamOe
zeXu;zY{=|6In*ea&Z{Bi1CiCUw(YK8Ebbllt9UOF=Zh1tyh^R8W9--BVXA;vhJS(_
z87U_M({X-m3(!d#ktQor5IQZ5d1ch|dQ$IyQ`unP;uD%&Uj1#>b_UJQos#aZ5FrH5
zx#Ruyhssp;Y{UqO(X{nvYyN+ctqMTZXTGZkPN9*5{m4t#hMuMQGL(znEzjBd2NiJg
z9F>CKb21%LIg}7AovL#NQZs^8Dqxb}<kTUFHfqhAq5g8H1tLF?K?WBvC9$qQygYn)
zu8bD#DW1BFFpea|+GyLPhUcI;t6W1smx7#jP1BD^zGR(E-J9!|19cPycs)(0yZ`lO
PulT!?DZ+$>*vlShFl8v~

literal 0
HcmV?d00001

diff --git a/tests/testfilebazmin_plr.bz2 b/tests/testfilebazmin_plr.bz2
new file mode 100755
index 0000000000000000000000000000000000000000..e4fcf85d21856066043e11dc1a18e75487d7416b
GIT binary patch
literal 3337
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
MtegPB(a)i@SL02G@!=l}o!

literal 0
HcmV?d00001

-- 
1.8.3.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]