[patch i386 pe]: Allow multilib version gas for i386 pe-coff

H.J. Lu hjl.tools@gmail.com
Tue May 19 22:09:00 GMT 2009


On Tue, May 19, 2009 at 2:47 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, May 19, 2009 at 1:31 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>> 2009/5/19 H.J. Lu <hjl.tools@gmail.com>:
>>> On Tue, May 19, 2009 at 1:12 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>>> 2009/5/19 H.J. Lu <hjl.tools@gmail.com>:
>>>>> On Tue, May 19, 2009 at 12:24 PM, Dave Korn
>>>>> <dave.korn.cygwin@googlemail.com> wrote:
>>>>>> H.J. Lu wrote:
>>>>>>> On Tue, May 19, 2009 at 11:57 AM, Dave Korn
>>>>>>> <dave.korn.cygwin@googlemail.com> wrote:
>>>>>>>> H.J. Lu wrote:
>>>>>>>>> On Tue, May 19, 2009 at 11:19 AM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>>>>>>>>> Well, I tried this and I found that in gas/output-file.c obj-coff.h is
>>>>>>>>>> included, but the tc-i386.h isn't. So if I move code into tc-i386.h I
>>>>>>>>>> get build failures for PE(+) x86/x64
>>>>>>>>>>
>>>>>>>>>> So, how to continue here?
>>>>>>>>>>
>>>>>>>>> How does Linux/x86-64 deal with this issue?
>>>>>>>>  HJ, perhaps you can explain the motivation for your change request a bit
>>>>>>>> clearer.  ISTM that ELF does things one way, COFF another.  All the other COFF
>>>>>>>> targets define TARGET_FORMAT in cpu-specific chunks of obj-coff.h, ELF and
>>>>>>>> AOUT targets define TARGET_FORMAT in cpu-specific header files.  This is
>>>>>>>> probably just a historical accident, but I'm not sure why that means we should
>>>>>>>> try and fix it now for just one single target?
>>>>>>>>
>>>>>>>
>>>>>>> Those x86 32/64bit processing is handled in tc-i386.[ch] so far. I'd like
>>>>>>> to keep this way so that any future changes to x86 won't break x86 32/64bit
>>>>>>> processing.
>>>>>>
>>>>>>  Hmm, I see what you mean, it's a cpu-thing rather than an object format
>>>>>> thing.  (BTW, did you mean to send this off-list?)
>>>>>>
>>>>>
>>>>> Oops. I didn't mean it.
>>>>>
>>>>>>  I guess the next question is "Why doesn't putting them into tc-i386.h work,
>>>>>> considering that obj-coff.h begins with a #include of targ-cpu.h"?
>>>>>>
>>>>>
>>>>> That was my question too.
>>>>
>>>> Well, the answer isn't that hard here. The generated header file
>>>> targ-env.h is the reason. For pe(p) it simply includes te-pe(p).h, but
>>>> for linux the tc-i386.h file is included by it, too. I didn't
>>>> investigate into the reason for this, but this is the answer, why it
>>>> didn't break on linux 32/64 target.
>>>>
>>>
>>> Then you should include tc-i386.h in targ-env.h if you want to
>>> support --32/--64 on x86.
>>>
>>>
>>>
>>> --
>>> H.J.
>>>
>>
>
> Both obj-elf.h and obj-coff.h  include "targ-cpu.h", which has
>
> #include "tc-i386.h"
>
> Why didn't it work for you?
>
>

This patch moves TARGET_FORMAT from obj-coff. to tc-i386.h
for x86.


-- 
H.J.
-------------- next part --------------
--- ./obj-coff.h.foo	2007-10-30 11:48:38.000000000 -0700
+++ ./obj-coff.h	2009-05-19 15:03:51.000000000 -0700
@@ -61,16 +61,6 @@
 #include "coff/i386.h"
 #endif
 
-#ifdef TE_PE
-#ifdef TE_PEP
-extern const char *i386_target_format (void);
-#define TARGET_FORMAT i386_target_format ()
-#define COFF_TARGET_FORMAT "pe-x86-64"
-#else
-#define TARGET_FORMAT "pe-i386"
-#endif
-#endif
-
 #ifndef TARGET_FORMAT
 #ifdef TE_PEP
 #define TARGET_FORMAT "coff-x86-64"
--- ./tc-i386.c.foo	2009-05-05 14:52:13.000000000 -0700
+++ ./tc-i386.c	2009-05-19 15:07:08.000000000 -0700
@@ -8364,8 +8364,7 @@ i386_target_format (void)
     {
 #ifdef TE_PEP
     case bfd_target_coff_flavour:
-      return flag_code == CODE_64BIT ? COFF_TARGET_FORMAT : "pe-i386";
-      break;
+      return flag_code == CODE_64BIT ? PE_TARGET_FORMAT64 : PE_TARGET_FORMAT;
 #endif
 #ifdef OBJ_MAYBE_AOUT
     case bfd_target_aout_flavour:
--- ./tc-i386.h.foo	2009-04-21 14:05:30.000000000 -0700
+++ ./tc-i386.h	2009-05-19 15:03:51.000000000 -0700
@@ -70,8 +70,12 @@ extern unsigned long i386_mach (void);
 #define ELF_TARGET_FORMAT64	"elf64-x86-64"
 #endif
 
+#define PE_TARGET_FORMAT "pe-i386"
+#define PE_TARGET_FORMAT64 "pe-x86-64"
+
 #if ((defined (OBJ_MAYBE_COFF) && defined (OBJ_MAYBE_AOUT)) \
-     || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF))
+     || defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF) \
+     || defined (TE_PE) || defined (TE_PEP))
 extern const char *i386_target_format (void);
 #define TARGET_FORMAT i386_target_format ()
 #else


More information about the Binutils mailing list