Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Date: Mon, 20 Oct 2003 03:16:15 +0200 From: Edouard Gomez To: cygwin AT cygwin DOT com Subject: Problem with recent GNU ld packages Message-ID: <20031020011615.GC879@leeloo> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="GvXjxJ+pjyke8COw" Content-Disposition: inline User-Agent: Mutt/1.5.4i Note-from-DJ: This may be spam --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--