`.eh_frame'和collect2.exe中的错误重定位地址:错误:ld在使用MinGW编译时返回1退出状态

时间:2014-12-10 13:55:42

标签: c windows gcc mingw ld

在我的系统上完成MinGW和GCC的安装后,我决定对其进行测试。我写了以下3个文件:

complex.h

# ifndef hjp_complex
# define hjp_complex

typedef struct _complex
{
    double real, image;
} complex;

complex complex_add( const complex a, const complex b );
complex complex_sub( const complex a, const complex b );
complex complex_mul( const complex a, const complex b );

# endif

complex.c里

# include "complex.h"

complex complex_add( const complex a, const complex b ) {
    complex c = a;
    c.real += b.real;
    c.image += b.image;
    return c;
}

complex complex_sub( const complex a, const complex b ) {
    complex c = a;
    c.real -= b.real;
    c.image -= b.image;
    return c;
}

complex complex_mul( const complex a, const complex b ) {
    complex c = a;
    c.real = a.real * b.real - a.image * b.image;
    c.image = a.real * b.image + a.image * b.real;
    return c;
}

testing.c

# include <stdio.h>
# include "complex.h"

# define cmplx_out(t) printf( "%.2f + %.2fi\n", t.real, t.image )

int main() {
    complex x, g, h;
    x.real = 3;         h.real = 12;
    x.image = 12;       h.image = 3;
    cmplx_out( x );
    cmplx_out( h );
    return 0;
}

之后,编译和执行testing.c工作正常:

C:\Users\hjpotter92\Documents\Programming>gcc testing.c

C:\Users\hjpotter92\Documents\Programming>a
3.00 + 12.00i
12.00 + 3.00i

现在,在测试复数计算的函数时(新testing.c):

# include <stdio.h>
# include "complex.h"

# define cmplx_out(t) printf( "%.2f + %.2fi\n", t.real, t.image )

int main() {
    complex x, g, h;
    x.real = 3;         h.real = 12;
    x.image = 12;       h.image = 3;
    g = complex_mul( x, h );
    cmplx_out( g );
    g = complex_sub( x, h );
    cmplx_out( g );
    g = complex_add( x, h );
    cmplx_out( g );
    return 0;
}

当我尝试编译它时:

C:\Users\hjpotter92\Documents\Programming>gcc testing.c
C:\Users\HJPOTT~1\AppData\Local\Temp\ccwD6Lqh.o:testing.c:(.text+0x7e): undefined reference to `complex_mul'
C:\Users\HJPOTT~1\AppData\Local\Temp\ccwD6Lqh.o:testing.c:(.text+0xe8): undefined reference to `complex_sub'
C:\Users\HJPOTT~1\AppData\Local\Temp\ccwD6Lqh.o:testing.c:(.text+0x172): undefined reference to `complex_add'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\HJPOTT~1\AppData\Local\Temp\ccwD6Lqh.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

参考其他几个问题,我尝试了很多组合:

  • 编译它们

    C:\Users\hjpotter92\Documents\Programming>gcc complex.c testing.c
    C:\Users\HJPOTT~1\AppData\Local\Temp\ccKuURyc.o:testing.c:(.text+0x7e): undefined reference to `complex_mul'
    C:\Users\HJPOTT~1\AppData\Local\Temp\ccKuURyc.o:testing.c:(.text+0xe8): undefined reference to `complex_sub'
    C:\Users\HJPOTT~1\AppData\Local\Temp\ccKuURyc.o:testing.c:(.text+0x172): undefined reference to `complex_add'
    c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\HJPOTT~1\AppData\Local\Temp\ccKuURyc.o: bad reloc address 0x20 in section `.eh_frame'
    c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
    collect2.exe: error: ld returned 1 exit status
    
  • 使用以下方法创建组合输出并生成输出:

    C:\Users\hjpotter92\Documents\Programming>gcc -c testing.c
    
    C:\Users\hjpotter92\Documents\Programming>gcc -c complex.c
    
    C:\Users\hjpotter92\Documents\Programming>gcc complex.o testing.o
    testing.o:testing.c:(.text+0x7e): undefined reference to `complex_mul'
    testing.o:testing.c:(.text+0xe8): undefined reference to `complex_sub'
    testing.o:testing.c:(.text+0x172): undefined reference to `complex_add'
    c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: testing.o: bad reloc address 0x20 in section `.eh_frame'
    c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
    collect2.exe: error: ld returned 1 exit status
    

在传递-Wall参数时未观察到输出差异。

有人可以帮我解决这个问题吗?该程序似乎非常简单,编译和执行它不会有任何问题。

PS :该程序在Arch机器上完美运行:

archdesktop% gcc complex.c testing.c
archdesktop% ./a.out
0.00 + 153.00i
-9.00 + 9.00i
15.00 + 15.00i

GCC详情:

C:\Users\hjpotter92\Documents\Programming>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=mingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto --enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-mp=/usr/src/pkg/gmp-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T
Thread model: win32
gcc version 4.8.1 (GCC)

我使用mingw-get安装gcc。

1 个答案:

答案 0 :(得分:0)

显然,the suggestion of在编译时使用-v标志似乎编译程序没有错误。成功使用-v编译程序后,gcc并未遇到我之前尝试过的任何方法的任何错误。

C:\Users\hjpotter92\Documents\Programming>gcc -v testing.c complex.c
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=mingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto --enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gmp-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T
Thread model: win32
gcc version 4.8.1 (GCC)
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=pentiumpro'
 c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/cc1.exe -quiet -v -iprefix c:\mingw\bin\../lib/gcc/mingw32/4.8.1/ testing.c -quiet -dumpbase testing.c -mtune=generic -march=pentiumpro -auxbase testing -version -o C:\Users\HJPOTT~1\AppData\Local\Temp\ccDBoHzE.s
GNU C (GCC) version 4.8.1 (mingw32)
        compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../mingw32/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../include"
ignoring duplicate directory "/mingw/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include-fixed"
ignoring nonexistent directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../mingw32/include"
ignoring duplicate directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../include
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include-fixed
End of search list.
GNU C (GCC) version 4.8.1 (mingw32)
        compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 767202a405449496e68a54c4eee91a28
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=pentiumpro'
 c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/as.exe -v -o C:\Users\HJPOTT~1\AppData\Local\Temp\ccc6ue9i.o C:\Users\HJPOTT~1\AppData\Local\Temp\ccDBoHzE.s
GNU assembler version 2.24 (mingw32) using BFD version (GNU Binutils) 2.24
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=pentiumpro'
 c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/cc1.exe -quiet -v -iprefix c:\mingw\bin\../lib/gcc/mingw32/4.8.1/ complex.c -quiet -dumpbase complex.c -mtune=generic -march=pentiumpro -auxbase complex -version -o C:\Users\HJPOTT~1\AppData\Local\Temp\ccDBoHzE.s
GNU C (GCC) version 4.8.1 (mingw32)
        compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../mingw32/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../include"
ignoring duplicate directory "/mingw/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include-fixed"
ignoring nonexistent directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../../../../mingw32/include"
ignoring duplicate directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../include
 c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include-fixed
End of search list.
GNU C (GCC) version 4.8.1 (mingw32)
        compiled by GNU C version 4.8.1, GMP version 5.1.2, MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 767202a405449496e68a54c4eee91a28
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=pentiumpro'
 c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/as.exe -v -o C:\Users\HJPOTT~1\AppData\Local\Temp\ccPq9b2h.o C:\Users\HJPOTT~1\AppData\Local\Temp\ccDBoHzE.s
GNU assembler version 2.24 (mingw32) using BFD version (GNU Binutils) 2.24
COMPILER_PATH=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/;c:/mingw/bin/../libexec/gcc/;c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/
LIBRARY_PATH=c:/mingw/bin/../lib/gcc/mingw32/4.8.1/;c:/mingw/bin/../lib/gcc/;c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/lib/;c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=pentiumpro'
 c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/collect2.exe -Bdynamic c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../crt2.o c:/mingw/bin/../lib/gcc/mingw32/4.8.1/crtbegin.o -Lc:/mingw/bin/../lib/gcc/mingw32/4.8.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../.. C:\Users\HJPOTT~1\AppData\Local\Temp\ccc6ue9i.o C:\Users\HJPOTT~1\AppData\Local\Temp\ccPq9b2h.o -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt c:/mingw/bin/../lib/gcc/mingw32/4.8.1/crtend.o