Advise on long types in 64-bit binutils PE compiles.
Ian Lance Taylor
iant@google.com
Thu Jun 19 16:20:00 GMT 2008
More information about the Binutils mailing list
Thu Jun 19 16:20:00 GMT 2008
- Previous message (by thread): Advise on long types in 64-bit binutils PE compiles.
- Next message (by thread): Advise on long types in 64-bit binutils PE compiles.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Jerker Bäck <jerker.back@telia.com> writes: > This may seem like a trivial and off-topic question, but it puzzles me every > time I try dive into binutils. > How to treat the long type in binutils? > The obvious answer is: A long type is a long type is a long type... > But actually it's not that simple, at least not for me. This is my opinion. You may assume that long is at least 32 bits. If you need to store a target value which may be 64 bits, you must not use long; you should use bfd_vma, bfd_signed_vma, symvalue, etc., and you should ensure that target_size=64 appears in the entry for your target vector in bfd/configure.in. > Do binutils assume that a long type is capable of holding a pointer? They shouldn't. But I wouldn't be surprised if they do. If you need to treat a pointer as an integer for some reason, #include "bfd_stdint.h" and use uintptr_t. Note that of course you should never use a long to hold a target address; for a target address you should always bfd_vma. > When it comes to the PE header as described in the <ntimage.h> WDK header, > the structures requires a 32bit long. Using the LP64 model here would never > work as the structure sizes would be totally wrong. What about the > corresponding structures in binutils? Do they also requires 32bit longs? > I've tried to figure this out, but it's very difficult to tell as the > structures may never be used as is. BFD never uses host types such as long when describing the external view of a structure in an object file. It uses char arrays of the proper size. See include/coff/pe.h. These values are then swapped in and out of internal arrays. The internal arrays may use host types such as long; as mentioned above long may only be used if the value is known to be 32 bits or less. > Examples of binutils PE structures with wrong sizes if LP64 is used: > internal_extra_pe_aouthdr, internal_filehdr As noted by the name, those are internal structures. They do not reflect the layout of the structure in the file. Those are expressed by external_PEI_DOS_hdr and external_PEI_IMAGE_hdr. > Examples of ambiguous use of longs in binutils: > > long bfd_get_mtime (bfd *abfd); returns a long converted time_t type. This is a bug, it should be time_t. > unsigned long bfd_calc_gnu_debuglink_crc32 ( > unsigned long crc, const unsigned char *buf, bfd_size_type len); This seems fine, since we can assume that long is 32 bits. The code looks correct to me even if long is a 64-bit type. Ian
- Previous message (by thread): Advise on long types in 64-bit binutils PE compiles.
- Next message (by thread): Advise on long types in 64-bit binutils PE compiles.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list