Mail Archives: cygwin/2003/10/19/21:15:20
--GvXjxJ+pjyke8COw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hello,
I am experiencing problems with recent GNU ld packages. The short
version is that the COFF object file reader seems to not determine the
.text section correct size, thus ld panics, complaining about a bad
relocation.
I have also to make clear, that though i experience this using cross
compiling tools (linux->win32), cygwin users have the same problems,
that's why i post this bug report here (the binutils-bug list seems to
be a spam list)
Here is a more detailed report:
------------------------------------------------------------------------
The buggy coff file can be obtained thanks to the assembly file
attached. This is the most reduced code i could do that triggers the
bug.
$ nasm -f elf -DPREFIX -o ld-bug.obj ld-bug.asm
When trying to link that file, i always have this error with GNU ld
2.14 (no errors with GNU ld 2.13):
ld-bug.obj: bad reloc address 0xa1 in section `.text'
So here we go, with a GNU ld 2.13, objdump -x reports that (only
relevent parts):
$ i386-mingw32-objdump -x ld-bug.obj
[...]
Sections:
Idx Nom Taille VMA LMA Fich off Algn
0 .data 0000000c 00000000 00000000 00000064 2**2
CONTENTS, ALLOC, LOAD, DATA
1 .text 000000f3 00000000 00000000 00000070 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
[...]
But GNU ld 2.14 (and current head cvs as well):
[...]
Sections:
Idx Nom Taille VMA LMA Fich off Algn
0 .data 0000000c 00000000 00000000 00000064 2**2
CONTENTS, ALLOC, LOAD, DATA
1 .text 0000000c 00000000 00000000 00000070 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
[...]
Note that the .text section is wrong in the second case.
I tried to debug GNU ld to find where the
(section_type_struct)->_raw_size field was set... but no luck. Is there
in this list a GNU ld (coff) guru wanting to help me spot and crush the
bug ?
--
Edouard Gomez
--GvXjxJ+pjyke8COw
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="ld-bug.asm"
BITS 32
;;----------------------------------------------------------------------------
;; Macros
;;----------------------------------------------------------------------------
%macro cglobal 1
%ifdef PREFIX
global _%1
%define %1 _%1
%else
global %1
%endif
%endmacro
%define CPUID_TSC 0x00000010
%define CPUID_MMX 0x00800000
%define CPUID_SSE 0x02000000
%define CPUID_SSE2 0x04000000
%define EXT_CPUID_3DNOW 0x80000000
%define EXT_CPUID_AMD_3DNOWEXT 0x40000000
%define EXT_CPUID_AMD_MMXEXT 0x00400000
%define XVID_CPU_MMX (1<< 0)
%define XVID_CPU_MMXEXT (1<< 1)
%define XVID_CPU_SSE (1<< 2)
%define XVID_CPU_SSE2 (1<< 3)
%define XVID_CPU_3DNOW (1<< 4)
%define XVID_CPU_3DNOWEXT (1<< 5)
%define XVID_CPU_TSC (1<< 6)
;; CHECK_FEATURE
;; arg1: cpu feature bit as defined by the cpu spec
;; arg2: cpu feature bit as defined in XviD
;; arg3: register where to store the result
%macro CHECK_FEATURE 3
mov ecx, %1
and ecx, edx
neg ecx
sbb ecx, ecx
and ecx, %2
or %3, ecx
%endmacro
;;----------------------------------------------------------------------------
;; Data
;;----------------------------------------------------------------------------
SECTION .data
vendorAMD:
db "AuthenticAMD"
;;----------------------------------------------------------------------------
;; Code
;;----------------------------------------------------------------------------
SECTION .text
;;
;; uint32_t do_cpuid(void)
;; returns cpuid info
ALIGN 16
cglobal do_cpuid
do_cpuid:
push ebx
push esi
push edi
push ebp
xor ebp, ebp
; CPUID command ?
pushfd
pop eax
mov ecx, eax
xor eax, 0x00200000
push eax
popfd
pushfd
pop eax
cmp eax, ecx
jz near .cpu_quit ; no CPUID command -> exit
; get vendor string, used later
xor eax, eax
cpuid
mov [esp-12], ebx ; vendor string
mov [esp-12+4], edx
mov [esp-12+8], ecx
test eax, eax
jz near .cpu_quit
mov eax, 1
cpuid
; RDTSC command ?
CHECK_FEATURE CPUID_TSC, XVID_CPU_TSC, ebp
; MMX support ?
CHECK_FEATURE CPUID_MMX, XVID_CPU_MMX, ebp
; SSE support ?
CHECK_FEATURE CPUID_SSE, (XVID_CPU_MMXEXT|XVID_CPU_SSE), ebp
; SSE2 support?
CHECK_FEATURE CPUID_SSE2, XVID_CPU_SSE2, ebp
; extended functions?
mov eax, 0x80000000
cpuid
cmp eax, 0x80000000
jbe near .cpu_quit ; No extended features, quit
; Yes there is
mov eax, 0x80000001
cpuid
; Compare the saved vendor string against AMD's string
lea esi, [vendorAMD]
lea edi, [esp-12]
mov ecx, 12
cld
repe cmpsb
jnz .cpu_quit
; 3DNow! support ?
CHECK_FEATURE EXT_CPUID_3DNOW, XVID_CPU_3DNOW, ebp
; 3DNOW extended ?
CHECK_FEATURE EXT_CPUID_AMD_3DNOWEXT, XVID_CPU_3DNOWEXT, ebp
; extended MMX ?
CHECK_FEATURE EXT_CPUID_AMD_MMXEXT, XVID_CPU_MMXEXT, ebp
.cpu_quit:
mov eax, ebp
pop ebp
pop edi
pop esi
pop ebx
ret
--GvXjxJ+pjyke8COw
Content-Type: text/plain; charset=us-ascii
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
--GvXjxJ+pjyke8COw--
- Raw text -