From mboxrd@z Thu Jan 1 00:00:00 1970 From: Charles Wilson To: DJ Delorie Cc: binutils@sources.redhat.com, cygwin@cygwin.com Subject: Re: [aida_s@mx12.freecom.ne.jp: A serious bug of "ld --enable-auto-import"] Date: Sat, 25 Aug 2001 22:47:00 -0000 Message-id: <3B888D76.6090102@ece.gatech.edu> References: <3B8884F6.80708@ece.gatech.edu> <200108260530.BAA28221@envy.delorie.com> X-SW-Source: 2001-08/msg00598.html DJ Delorie wrote: >>pe_find_data_imports:_hwstr1 >>->__head_cyghwstr_dll >>arelent: _hwstr1@0xd: add=0 <<<< this should be "add=12", right? >> > > Not always. Sometimes the addend is in the relent, and sometimes the > addend is in the data stream. It depends on the target format. > Well, in *this* case we're talking about pe-386.... > >>Unfortunately, that's as far as I can go. I don't know where the >>arelent structure gets filled with the approprate data from the .o, so I >>can't track down WHY the "12" isn't going into (arelent)->addend. >> > > Gas puts it there. Probably in src/gas/config/tc-i386.c's > tc_gen_reloc, but other places convert it from a bfd reloc to an > i386-specific reloc. Hmm...but the original bug report said (and I verified) that it works fine if you add the appropriate __declspec(dll??port) modifiers. Somehow, this is tied to the autoimport additions -- but none of that touched gas. Anyway, I'm confused. The .o file already contains the "12" (actually, 0c 00 00 00 in on-disk byte order), so gas has already done its work -- properly. The problem occurs during the linking step -- ld is ignoring the offset stored within the opcode and is blindly stuffing in the relocation address without adding the offset. That doesn't involve gas at all, does it?--gas is done, at this point. As *ld* runs, it has to fill arelent structures in order to actually *perform* the relocation, right? *That's* the part that is not happening correctly. --Chuck