A bugfix and a test for COFF import directory iterator

Pyry Kontio pyry.kontio at drasa.eu
Wed Oct 15 22:16:39 PDT 2014


Hi,

The reading the import directory (.idata section in COFF file format) with
COFF parser is broken. Basically, it calculates the section size wrong, and
doesn't even move the iterator when trying to iterate.

I fixed the problems without touching the API and tried to keep the changes
in minimum.

I also wrote a unit test that checks whether parsing the imports and export
works.

However, I haven't got any knowledge how the test suite in LLVM works, so
the test needs to be modified and adapted to that.

The patch is attached.

Best regards,
Pyry Kontio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141016/91c1598d/attachment.html>
-------------- next part --------------
From 7af86567e1a431fdf076c795ef55f6f44a14a009 Mon Sep 17 00:00:00 2001
From: Pyry Kontio <pyry.kontio at drasa.eu>
Date: Thu, 16 Oct 2014 07:25:22 +0300
Subject: [PATCH] Fixed COFF import directory iterator and made a test for it.

---
 COFFtest/COFFtest.cpp         | 160 ++++++++++++++++++++++++++++++++++++++++++
 COFFtest/libopennet.dll       | Bin 0 -> 11776 bytes
 lib/Object/COFFObjectFile.cpp |  20 ++++--
 3 files changed, 175 insertions(+), 5 deletions(-)
 create mode 100644 COFFtest/COFFtest.cpp
 create mode 100644 COFFtest/libopennet.dll

diff --git a/COFFtest/COFFtest.cpp b/COFFtest/COFFtest.cpp
new file mode 100644
index 0000000..c06d524
--- /dev/null
+++ b/COFFtest/COFFtest.cpp
@@ -0,0 +1,160 @@
+
+#include <clang/Frontend/CompilerInstance.h>
+#include <llvm/Object/COFF.h>
+#include <llvm/IR/LLVMContext.h>
+
+
+std::string coff_path = "libopennet.dll"; // This patch should be such that the test can find libopennet.dll.
+std::string expected_export_symbols[8] = { "DllGetVersion", "fclose_net", "feof_net", "fgets_net", "fopen_net", "fseek_net", "lseek_net", "open_net" };
+std::string expected_dependency_files[5] = { "msvcrt.dll", "msvcrt.dll", "WSOCK32.DLL" };
+std::string expected_import_symbols[5][15] = {
+	{ "_close", "_open", "_read", "_strdup" },
+	{ "__dllonexit", "_errno", "_stricmp", "_strnicmp", "_vsnprintf", "fflush", "free", "malloc", "memchr", "memcpy", "strchr", "strlen", "strstr", "strtoul" },
+	{ "WSACleanup", "WSAStartup", "bind", "connect", "gethostbyname", "htons", "inet_addr", "listen", "recv", "send", "shutdown", "socket" }
+};
+int expected_itercount_exported_symbols = 8;
+int expected_itercount_dependency_files = 3;
+int expected_itercount_imported_symbols = 30;
+
+
+
+// Returns true if everything is parsed without problems and the itercount tests passe.
+bool ParseCOFF(llvm::object::COFFObjectFile* COFFObjectFile,
+	std::vector<std::string> &ExportedSymbols,
+	std::vector<std::string> &DependencyFiles,
+	std::vector<std::vector<std::string>*> &ImportedSymbols)
+{
+
+	int itercount_exported_symbols = 0;
+
+	for (auto it = COFFObjectFile->export_directory_begin(); it != COFFObjectFile->export_directory_end(); ++it)
+	{
+		++itercount_exported_symbols;
+		llvm::StringRef Symbol;
+		if (it->getSymbolName(Symbol))
+		{
+			return false;
+		}
+		ExportedSymbols.push_back(Symbol);
+	}
+	if (itercount_exported_symbols != expected_itercount_exported_symbols)
+		return false;	// TEST FAIL: wrong number of iterantios with the export table
+	
+	int itercount_dependency_files = 0;
+	int itercount_imported_symbols = 0;
+
+	auto iter = COFFObjectFile->import_directory_begin();
+	auto end = COFFObjectFile->import_directory_end();
+
+	for (; iter != end; ++iter)
+	{
+		++itercount_dependency_files;
+		llvm::StringRef DllName;
+		if (iter->getName(DllName) && (DllName.endswith(".dll") || DllName.endswith(".DLL")))
+		{
+			return false;
+		}
+		else
+		{
+			auto *funcVec = new std::vector<std::string>();
+			ImportedSymbols.push_back(funcVec);
+			DependencyFiles.push_back(DllName);
+			const llvm::object::import_lookup_table_entry32* lookup;
+			iter->getImportLookupEntry(lookup);
+			for (; lookup->Data; ++lookup)
+			{
+				++itercount_imported_symbols;
+				llvm::StringRef FuncName;
+				uint16_t FuncHint;
+				if (COFFObjectFile->getHintName(lookup->getHintNameRVA(), FuncHint, FuncName))
+				{
+					return false;
+				}
+				funcVec->push_back(FuncName);
+			}
+		}
+	}
+	if (itercount_dependency_files != expected_itercount_dependency_files)
+		return false;	// TEST FAIL: wrong number of iterantios with the import table
+	if (itercount_imported_symbols != expected_itercount_imported_symbols)
+		return false;	// TEST FAIL: wrong number of iterantios with the import functions table
+
+	return true;
+
+}
+
+
+// Load a COFF object file "libopennet.dll" and pass it to the ParseCOFF function, and test whether the data was read correctly. Return code 0 == no problems.
+int main(int argc, char* argv[])
+{
+	std::unique_ptr<clang::CompilerInstance> C;
+	C.reset(new clang::CompilerInstance());
+
+	C->createFileManager();
+	auto &FM = C->getFileManager();
+
+	auto FileEntry = FM.getFile(coff_path);
+	if (!FileEntry)
+	{
+		return 1;
+	}
+
+	std::unique_ptr<llvm::MemoryBuffer> FileBuf(FM.getBufferForFile(FileEntry));
+	auto BinaryOrErr = llvm::object::createBinary(FileBuf->getMemBufferRef(), &llvm::getGlobalContext());
+	if (BinaryOrErr.getError())
+	{
+		return 1;
+	}
+
+	std::unique_ptr<llvm::object::Binary> Bin(std::move(BinaryOrErr.get()));
+	auto COFFObjectFile = llvm::dyn_cast<llvm::object::COFFObjectFile>(Bin.get());
+
+	std::vector<std::string> ExportedSymbols;
+	std::vector<std::string> DependencyFiles;
+	std::vector<std::vector<std::string>*> ImportedSymbols;
+
+	if (!ParseCOFF(COFFObjectFile, ExportedSymbols, DependencyFiles, ImportedSymbols))
+	{
+		return 1;
+	}
+
+	int k;
+
+	k = 0;
+	for (auto iter = ExportedSymbols.begin(); iter != ExportedSymbols.end(); ++iter)
+	{
+		if (iter->compare(expected_export_symbols[k]) != 0)
+		{
+			return 1;
+		}
+		k++;
+	};
+
+	k = 0;
+	for (auto iter = DependencyFiles.begin(); iter != DependencyFiles.end(); ++iter)
+	{
+		if (iter->compare(expected_dependency_files[k]) != 0)
+		{
+			return 1;
+		}
+		k++;
+	};
+
+	int j = 0;
+	for (auto row = ImportedSymbols.begin(); row != ImportedSymbols.end(); ++row)
+	{
+		k = 0;
+		for (auto col = (*row)->begin(); col != (*row)->end(); ++col)
+		{
+			if (col->compare(expected_import_symbols[j][k]) != 0)
+			{
+				return 1;
+			}
+			k++;
+		}
+		j++;
+	}
+
+	return 0;
+}
+
diff --git a/COFFtest/libopennet.dll b/COFFtest/libopennet.dll
new file mode 100644
index 0000000000000000000000000000000000000000..bd2270f6306bd8169146edbc0a38dab1a98fdc47
GIT binary patch
literal 11776
zcmeHN3v^V~x&D)k7$9+?1{%Go4)$P)#bhEWO+p?c2 at oYhY{Ekf<T-i3WG2p>fgk}B
zCZn7l0+B~WMNmKl1VQBy5HKW|_`m{@dJ$}kioFvDSH10BpcR?>{rk*>WQx7(-qpKS
z*Qy)-v-iLEzyJ5Y&prbW%xIx7BGLhTKB89i+)U#6_a6;dzTx%*H_+~Z?+<GY$$fuV
zK~=TGP;0kU+DmE-WhGXtO*WL84R)v1P;E72PtG^g*vifEk&%NWKkK}4M7bf?la%ip
z8<2L6Zn$G`NN6(MgqavXC?LuYM)Xu$DR9iQ-b4faJ%%j+OqO~{*hOT}_VNbifhM{<
zqBD#X6Is{+wM6G4cp|7Z5N!{d`bVJgvbj!XMmGXjA+}XB1_P}bpj~`<iCh8{V<IDf
zeKC}gtIb5z7GLUc at Jum3O#JxU*1&XTjiIm|J`nua$NgJde6>a=d{c}?*6r5*L?-5E
zci77?Eqn(b(hY#y0DYQC(3veZ5DH&5V3F+ at 3FzP2`lCN!|KA>%qI~YU5TiIRtIh~z
z=GU$(A#$N2OFDH*lu{stt5d?2Xvs4GQFUF2z^c+Ak91#jMyQcws;zXt<BUo?tDIJ6
zeyut$D;H+AN08?s=<M}2 at 4l0DcegoDcqZ`7J1x!foz$h18i09D>4`Q97H#saU6=tH
z1&*GVA<8ovj~=Jb=ku%uT^Dg-CboIkC>Mpk;mXX*>JYKJTaHtI%o|-^UCIacNHq)+
z?-GdPFRc1RFi30 at q9B{)ct&7KoyqEUwD?YFjJ(I1_wu6VkFIPfoSDLW40SAtdHn%u
zx!d%s+p$%@w>_uBuTRYP(C-AjkkZoITo+=MLMaBSj9^vXXNr!*HuqV%gqiFOA!;s=
zqT%}pwLmfm=^$k3Cvi+EFt0AND=V5B;Fqiz(ZMWWo<`=C6`|&0dsdWkx+^OdJ3(dO
zPMIjF5bQb{+o8lto+J>%qZc4Vr;asrwD{vSW!lty=%~t4nre}f)eN^!zvMIQ2Vs&r
zD^|brx5`H;A2??C>D8%{yIbGX2 at 2@SaUykAbliI|GF%-Wp`=M6N0eMi=Ls9kDHH|w
zEo)+;dOy4GLQX43ln!NlY|7UTotoj@;XdoUMU8iVSvM%L4eCBTt7v9N*LVXwL*6fW
zpMK|eDc?Fml|QIcBb0i`DU^(Gn2zmQ8%Y$hC_<eS8 at DJr?i=?z%A{Ci>!c{v8ly~#
zP^{6)*NNSiWGTtJQ60)|{p&!eJ^;DqgL&S?c&L-2<357Y;mjWfd;nu~p2aY(Cmm#3
zqBI};DH|K`S0Q|5k&MEuQSOWSB}1XFnjf3;SLLMR(dN12r&qHixS(kWR(t)GA079u
zD7O3vB}oc7Dg5;T)bji51IP)<idB#woDYM5s*Z at bP7r(6LMt$Izr>S%af8)S-lqcf
z*DcpG at 7|3QBa{fqV;0-wDQbR%N$HIHFy+$1P~{2=KU_F+q~ys5Maq?hBRh5R6yk_b
z7sSRnqT?>PeaZrM=)@>BKSlww{Ak4!h*D>Ef{(l>!Blm`Dknm|f{!_2b;z`{$U_mr
zzd+3%GrRj{cK?EKcp{A5 at BJg(q)v>EV+Vw*;0<T6V|1PYNS>bmyyEk<AU9i?7$J#5
z+zn7U8aWVy0y3ysQR*1g0S7yiIT!M<%Y9LfMGQUB5Ci%sBz81{B<g_ABVJnrk9t4V
z!m8*bPYm{X4{JE&p&nzP1=pjb-<K<mV3mLvSWPw|8NTPbVtzuo1FRuRDu8!fjelZW
zN0ltsQU!q5wfso~yF!F037ohz@{mgfUHpn9{XSWmjwOSz8rt3pZQX4+hYO)=bFP#O
z{gR+c48~jr(ZELnj{?rBMgW(Ds_e-NV2OytKwy%)TaLnMVRXMEhpX8V`^~_9i-81@
z3KrB9`-fBUXqr}tNI=IB9Eb2zi_k=##<^98Iq;G=x$1a-Ea&;^cKzOW?;Dsa89W_e
zf&duYXX`i!g<S(U8z9!;-Pl*y&p?MvH+au07KEw*b(IVI3J|&i*q4hq<ib9FHx<A>
z94!h$@LMqBT|KpMQ))s2PSM at s{WC?x!hfh`!&VgEB?xAnPYs36%oGe(K`eV!kn5XH
zfrL%0Vbi}3(`Fw(jM>gGa&?69b_iiJJ=NOQxAaX>&;lpnI9 at gRS0`$#o%*IvcsJ2_
zasGoM)lU(pQFO^VtWMy)VkJrP=*5csFy>8|4~Jic;^>5SZ)!=Mt%SiRMtC;~=A^-=
zG0I at fBr73GDzeFx*sc5mKF?9&k*3NC5lFv(SRBWb87PR|L9j#~M1Wa#R~TOqy&IXv
zA74SUM$m}hw&%Fc4e6<a)35Rqx5-4G^7|em<`12QmwUe8+U0zoFs{ImFx+9tDJaNG
zNQ^f|4$84P<W$3ON93T$L6mDNE0L>h*3{nkwWdWAA%33r0mAqZY`nTwnvUtjFQJ+w
zCRRy>JmEt?kQ+MBDHM;=>AooHQNM)W?c&H-DiwpSd6i_;33lPNF}0O!AYZ~cyEqxT
zAWG?I{MLtyf?zOjK1gsN_U;5P?W9DMQoso(b;@byc;#X*U9OaXaX2TrNKz2;9U6p6
zhkkFil#muF-;*{-j$e|UW=#BYg6lh-@|Ap}`|M)}aqfA_ at v;}98;`OBw2;AncpWcW
z0-l}N#nr=A=6-?|;{YCSQA1oubj>ZkD_5>uIx(!h at zVx0x#v=QLj#d>z>zPaTt`Bw
z+x1ac+&8Xo!so7JB{{E}>!lQop&}GU(U-9gvZWE}cf$lZMs)h+C5UMH+aS at qr(&pF
z^g)Gji9YSc2>lxCr4hWt`A24q{N?M6kr^+CquIIlgE2CU-(JmyQmW at sM2cxyu)13+
zhqW9;89{vPuRdSTx12h?Ex++XE7-qaz?F<^c>{I at cC!@rH!fFvbb5B-iCe4E(aNZP
z-zupM%N0tK^gMdjWu2hVCBEZ6%hMY$ElOQkDs95JE}dB;F{pW|wug@!l>A(cv!KOk
zI+P`Iba`zy)}D4<2p at Q+@hGc`dh76O1Xu8_TIZQ6_J?!qGU3JwSG^P!Di88Z!hFx&
znBk4Ik&W!R4d~VPhu?m62(O_G*do4wod-Qjj}@GCFoq2<>6?}d)0av|fgZpj>|dqX
zf@)ufN!JBk!1nKRWTha3Bi(HWzJ)q<(zX18<MI_h;Tbq(&{gwUu~A59vDy0{jIPoo
z`#mUspno%GkUBjAcLKaro7W2MK_|TRHn#R8Yi<bkWQ5=&Joz0GrPq_32t8iR?8ktV
zNa4z}z`c>Zxx at p`55B76YQRBc2eEqBX>7%jfo0dxh#ouET3S$YI(M6Voh#WO4``i6
z*Ee)@nMBcanMAsGnOG(2GV#j*U5pNAK$j_&O93x`-|)hc+RBy|V50ek7YE^0L3mye
zo*jfw55i4Bcv=u%5QOIh;kiM0c|RQAM<O@*OOO4heUH7MGa?(K+}%zcfA9FB)FEQ#
zeqHle-9{ebOR>lMS)cE>7rrv!qwQ;-9LKL+=Z_Fr({1?vTkvPx47HCleqZ>apJT#_
z&WqmPsgeJMAwHJgk>5MOvnUIbn!8vB=9j#!;{DS1`;f(UJAW!99S~_SgfPcKhYO)M
z2ZRo|DzuNlPx=TvE(9tUO==<JorSzZY<|m>{bZ`GZ2X3w%IA)u>VrByg2O`=^RHCe
zy!{J&X!_fO$|qP&=eLbLs<DTA*Fd_Pdv8zN5sZ~{$}u%uHR*iku*Wz2d~yGLxe$bV
zg7B~U;oALmBwp|0E~xgo3u0{GL+~RcB41yHhQ8sK`|bA)kLnkH-|*-loPzL}AUrk*
zHw59vAbdm+J~9ZGg7EMlTo;5#^v7|GaN(g7y(q$e at yBHYeoy_O{mXhF at Y{P`9)4$l
z7x*g1FamfEpbB98G0`qu&G>g})6F>B at Vj;K5TZPQ0q_K9Rs)^~Yz4dyI0WbdoCGlE
zPzu8(={g!f*OR5X)K+V at TFr8Nxy3@+7Rv;)Jk at M>;POuuWfq&mT!clcFxx7$L8V!C
zXd~XJjT~n495J%=j(Qha<`3<E@<2iHRf=<^MCXB9`pijXM3;eY?=x47xwI1c-d2mX
zdO#CkX&<^Z7;gdW2DAZ=0X_zJ0AB$v1Hz$0G{68D2}lM6S~kW7fO3EZPzP87XaTGR
zYys>7v;vL-0_~qkpX;eeBsc3ehKe{_>0T<bn at h^6fQlTlz1&%gHHnIfP#89=xvp9U
zzJ`j-cDvQa`<@M9y6UnT5Uv+vt3VEg6wP&5Ywgumxq|78p%oPtr=yC;nV}VSvl*9;
z(3%pkMFffFhSr#C%Bt)<t`p<h`8-||3ikf_^*pvfNwm#8#$O(9<FRaWS}?warsdz8
zWigjnh3a%W<N0!lUDj}kN~^8qM0Zk|4HaL;_QVnDxeA~DrSq*NHD*epD%oar(9fwF
zWnWZMUT&upoDvRMlbud>bJ<*?EOMBc*93A at IpuQOJZP3f4qMqA92VS)`$LUmZkb&>
zV<;MH{}<@XV+45oZ(v&f<gAIK?upON&4ptBob4yQ|MnV&6B_mrHQ=8IXgc~R^h?mA
zqpNfw;yq!y#{58h3$-#aT3`DA3K9Rr+7LX?^l$SdT3>pQ)AQfM|1{P-$o;D8Fz~lL
z<OaW<0<9c)J$`8jG}y#<Y%%~s#M?~_ at bEVl=x at 2Vq|k4y>*+6#yXkn*HhS?RBkf!_
zihlRSlXR-;UD`9lNzX5SnpU4oqQeclY4dZNY2`~V(e8pBR97$4hJ-EjvU?UiXsV=&
z6c at c5=cG3pH&M&%SLj{)YTA~)fVQa9X-D~PGRK{xC0ie%eJfVdyRW-x&ygnT*d<eG
zYzjU3>Rq%iX&Y^Ra5*hI9ZxM=EcEH=`SknG=g`SbE9r^SE?Rf6jMnbCjW#%UP<!Di
z+Oc95EzNRL>m6I@?22covqh%kTOOr{hUL(K^Xc^2m$PZzred<CSg3w|6Fs0$qdD0p
zXjIK~DoiS)JzJO4x+8V;*`r74nU)&rI6jNcZGMDKbb{9>DYSmQi8c;=oTitorDOY+
z()P9(dTQr!s=nzV+PP>B9e!;IRoys=8h=zyTV{Mjb<#R&Up|vuMLX!Nxb-A2pG(J}
z`^(Gn=)i$SYF}`i-dOPn%}$s_&6Us7GY{^d&Z(Q|#I{wma^c6ceD{0wz%TBl at +anz
z3IAfge)3K_x2>5TPFhZ at H*KYL`$o~nt5=fOGmaW(oTB$LR?*UwwY2_FA~lav=<u%}
zqmv(J(u$fgYF%`O-t4TVS6?llWltAU*Y-!~;F4<k at ZWEu*A`Y&$*^wP^+FwOKem8Q
zHvgJFUseY{*3*m6l+p2LEwumMCfYODMf+Ebp`)|U(WkFB(~hPVa<$z}-A(K0?azwn
z*ohkY)uLM3dGj*bzxEM&%l0hwe7J at -smrLsdV~&Vx at h6d&9rgG%e1?@g1QTK(x!zK
zq)0CM&8yGSlef+z at 0rmw>z0wU6|p>Zz()1eUG(A;<@6`}I$E=Q6S+40kv^RH9<`}w
zXmV^a9eZ&mo!Ry{Rs3u$HQqggW at qi8`xCd*#F%lkaluJC(z=2=w>?EInY-w>FD{`u
zBOUZq%S-fd^+uX@`@2-WsDcizIzwHptLe<vUj at qGhu-gjUq1MHNZRQA1sXc=mggtk
zv0;1W?8joC!py2QL+)F*Yp40<*AAw?ffJ@=+KMGjPbAJtjehn1$_!c-T6 at opRmG1u
zh8InJy5i82r8P1C_M+`)`=qt{XMQxuc$2!`RKB%rcYZ?nHr>$0QwF?J{pJl19Dey%
z^9skl6z1BY{QR!Hk#lZadSFX@#HiM!lt+i%zQ>Ta!2RQUAD-CuP{Ww%G_rC0>Nuy}
zlHIatocwE|pFVs2h~>Yyvw8mGGgofRf`WC))(O`Q{>h9*lk5Hef8&LPxp(Jmehw$(
z-!}d#zMP5sm>zdDybKr`a5gdoS^y8MGcE7YzNq=#5Cuo at 20o!fa1JM7JeBgP2+wi!
zON{QL$utT0eRz(?nA;)UpRO=H|5V1mngx2WCIim_LIHi-8SxItCz<S2O;)M|w`#JG
z8JzJUL40A_D`<?kV;FI#;C>tczl73HAT0|tHTds8C7_=VZAyTdg@}ph&6qVq`Z)A5
zMs`rLBnQS0%%{;j at h2X$b1<jT$AhOGx?~7G6(KJ{PA+zpiFMw~t$?ZoCxhT=1HD~H
zH~42OfHOw}B-x;?3`r$oZVcw;W6p`bOlWQp^W|cv=8ICSvc}9!#*^(Urv#yy0XEuz
zRfFsNUJ9q6U>gnCQ6=_jHrEJSS%<4D6X2^Uz;i+8z#nbj1oZ4Nw#0(fJZMph5!=qR
zeSI)S>|zZAKCHxECk4EhfIT+&X1<6g+n*pt0cr8jQHCWJ?BF(=hQZH)_-6~f%AiR#
zc*uC#z?~awQHq?a6}qyvGNnR`Dag!R^i_UevDTbX2BCkcu*nW>xQ(X4ePm4)7CZXL
zFhZvkKqBBC<lN8k<YpB*Y8n(kBO7=JG!EwSkJFQDL5rkS#N}$1vyG*~%N#e&7p$j@
zTOjAG8TNA|xk at +^?9EEycYNo=Gi)1MXMpc)BA5DBO`6|x97nE3-fIGnYgfu*{0`bz
zW`Xc{IdrIj4!leJ7dPrF;o5ci3jS-EmTkdt)>f`%^($;PVxfl)ll^vb{Mq_Igc#FK
zhih?&M at 3oihntokdEmo!=0qmT{mzza#g_M_ioEK-FE}s0FSqRYstUo`%6VM|U$f?8
zA)C*`a_|mRET4*8<I}KWrBR3>pJQ6>&Fh_uhqw8Jv4fWxvC~d8GxAx>676i8LBk<)
zn)t)|b4AL~AQiQm&|BBnia4J{T*+M1*UrIgW{5Wi$374N&SdRW=Wk?wBWPJ-1t$wA
z`_}nD-FYVXq5VA%;7whR^;F|R<5J at r#<z?fqb~8*#NmneCr(LB8l5xx@@QT1h~(1b
zkd)b}t*OtA*+0gUW=~(7z9M}?`fKU!>D}p{rvEuTG~=d>J2EC at Jd{zM at o2`<jExzu
zWbDs4n{htlPZ=SZ(V4er-jz8vGbeLKW^v|*%-1s8GrKd9c8DQ<QZ(LSyvI1!_)BA{
h(QaI9Tw&Z`e9hQy>^6SNhl}{%e>(I(w12z@{u{Rk8{hx{

literal 0
HcmV?d00001

diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp
index 3beab00..9c8fbec 100644
--- a/lib/Object/COFFObjectFile.cpp
+++ b/lib/Object/COFFObjectFile.cpp
@@ -467,8 +467,6 @@ std::error_code COFFObjectFile::initImportTablePtr() {
 
   uint32_t ImportTableRva = DataEntry->RelativeVirtualAddress;
   // -1 because the last entry is the null entry.
-  NumberOfImportDirectory = DataEntry->Size /
-      sizeof(import_directory_table_entry) - 1;
 
   // Find the section that contains the RVA. This is needed because the RVA is
   // the import table's memory address which is different from its file offset.
@@ -526,7 +524,7 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
       COFFBigObjHeader(nullptr), PE32Header(nullptr), PE32PlusHeader(nullptr),
       DataDirectory(nullptr), SectionTable(nullptr), SymbolTable16(nullptr),
       SymbolTable32(nullptr), StringTable(nullptr), StringTableSize(0),
-      ImportDirectory(nullptr), NumberOfImportDirectory(0),
+      ImportDirectory(nullptr),
       DelayImportDirectory(nullptr), NumberOfDelayImportDirectory(0),
       ExportDirectory(nullptr) {
   // Check that we at least have enough room for a header.
@@ -656,7 +654,7 @@ import_directory_iterator COFFObjectFile::import_directory_begin() const {
 
 import_directory_iterator COFFObjectFile::import_directory_end() const {
   return import_directory_iterator(
-      ImportDirectoryEntryRef(ImportDirectory, NumberOfImportDirectory, this));
+      ImportDirectoryEntryRef(ImportDirectory, -1, this));
 }
 
 delay_import_directory_iterator
@@ -1066,9 +1064,18 @@ bool COFFObjectFile::isRelocatableObject() const {
   return !DataDirectory;
 }
 
+// Import (.idata) section
+
 bool ImportDirectoryEntryRef::
 operator==(const ImportDirectoryEntryRef &Other) const {
-  return ImportTable == Other.ImportTable && Index == Other.Index;
+	if (ImportTable[Index].ImportLookupTableRVA == NULL && Other.Index == -1)
+	{
+		return true;
+	}
+	else
+	{
+		return ImportTable == Other.ImportTable && Index == Other.Index;
+	}
 }
 
 void ImportDirectoryEntryRef::moveNext() {
@@ -1161,10 +1168,13 @@ std::error_code ImportDirectoryEntryRef::getImportLookupEntry(
   uint32_t RVA = ImportTable[Index].ImportLookupTableRVA;
   if (std::error_code EC = OwningObject->getRvaPtr(RVA, IntPtr))
     return EC;
+  OwningObject->getRvaPtr(ImportTable[Index].ImportLookupTableRVA, IntPtr);
   Result = reinterpret_cast<const import_lookup_table_entry32 *>(IntPtr);
   return object_error::success;
 }
 
+//Export (.edata) section
+
 bool DelayImportDirectoryEntryRef::
 operator==(const DelayImportDirectoryEntryRef &Other) const {
   return Table == Other.Table && Index == Other.Index;
-- 
1.8.3.msysgit.0



More information about the llvm-commits mailing list