我正在尝试将Solaris10上的pcre 3.38编译为64位二进制文件。它开始编译,然后在某个时候停止抱怨“错误的ELF类”,事实上,事实证明,一些创建的目标文件都是32位的-尽管大多数都是所需的64位。
以下是我所做的工作:
./configure CFLAGS=-m64 LDFLAGS=-m64然后
make
rm -f pcre_chartables.c
ln -s ./pcre_chartables.c.dist pcre_chartables.c
make all-am
make[1]: Entering directory `/local/src/pcre-8.38'
CC libpcre_la-pcre_byte_order.lo
CC libpcre_la-pcre_compile.lo
CC libpcre_la-pcre_config.lo
CC libpcre_la-pcre_dfa_exec.lo
CC libpcre_la-pcre_exec.lo
CC libpcre_la-pcre_fullinfo.lo
CC libpcre_la-pcre_get.lo
CC libpcre_la-pcre_globals.lo
CC libpcre_la-pcre_jit_compile.lo
CC libpcre_la-pcre_maketables.lo
CC libpcre_la-pcre_newline.lo
CC libpcre_la-pcre_ord2utf8.lo
CC libpcre_la-pcre_refcount.lo
CC libpcre_la-pcre_string_utils.lo
CC libpcre_la-pcre_study.lo
CC libpcre_la-pcre_tables.lo
CC libpcre_la-pcre_ucd.lo
CC libpcre_la-pcre_valid_utf8.lo
CC libpcre_la-pcre_version.lo
CC libpcre_la-pcre_xclass.lo
CC libpcre_la-pcre_chartables.lo
CCLD libpcre.la
CC libpcreposix_la-pcreposix.lo
CCLD libpcreposix.la
CXX libpcrecpp_la-pcrecpp.lo
CXX libpcrecpp_la-pcre_scanner.lo
CXX libpcrecpp_la-pcre_stringpiece.lo
CXXLD libpcrecpp.la
ld: fatal: file ./.libs/libpcre.so: wrong ELF class: ELFCLASS64
ld: fatal: file processing errors. No output written to .libs/libpcrecpp.so.0.0.1
collect2: ld returned 1 exit status
make[1]: *** [libpcrecpp.la] Error 1
make[1]: Leaving directory `/local/src/pcre-8.38'
make: *** [all] Error 2检查一下war做了什么,我看到的主要是64位的目标文件,但也有一些32位的,我假设这就是问题的来源:
file .libs/*
.libs/libpcre_la-pcre_byte_order.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_chartables.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_compile.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_config.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_dfa_exec.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_exec.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_fullinfo.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_get.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_globals.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_jit_compile.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_maketables.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_newline.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_ord2utf8.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_refcount.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_string_utils.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_study.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_tables.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_ucd.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_valid_utf8.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_version.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre_la-pcre_xclass.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcre.a: current ar archive, 32-bit symbol table
.libs/libpcre.la: ascii text
.libs/libpcre.lai: ascii text
.libs/libpcre.so: ELF 64-bit MSB dynamic lib SPARCV9 Version 1, dynamically linked, not stripped, no debugging information available
.libs/libpcre.so.1: ELF 64-bit MSB dynamic lib SPARCV9 Version 1, dynamically linked, not stripped, no debugging information available
.libs/libpcre.so.1.2.6: ELF 64-bit MSB dynamic lib SPARCV9 Version 1, dynamically linked, not stripped, no debugging information available
.libs/libpcrecpp_la-pcre_scanner.o: ELF 32-bit MSB relocatable SPARC Version 1
.libs/libpcrecpp_la-pcre_stringpiece.o: ELF 32-bit MSB relocatable SPARC Version 1
.libs/libpcrecpp_la-pcrecpp.o: ELF 32-bit MSB relocatable SPARC Version 1
.libs/libpcreposix_la-pcreposix.o: ELF 64-bit MSB relocatable SPARCV9 Version 1
.libs/libpcreposix.a: current ar archive, 32-bit symbol table
.libs/libpcreposix.la: ascii text
.libs/libpcreposix.lai: ascii text
.libs/libpcreposix.so: ELF 64-bit MSB dynamic lib SPARCV9 Version 1, dynamically linked, not stripped, no debugging information available
.libs/libpcreposix.so.0: ELF 64-bit MSB dynamic lib SPARCV9 Version 1, dynamically linked, not stripped, no debugging information available
.libs/libpcreposix.so.0.0.3: ELF 64-bit MSB dynamic lib SPARCV9 Version 1, dynamically linked, not stripped, no debugging information available我不清楚为什么要构建32位的二进制文件,CFLAGS=-m64应该会解决这个问题。
你知道如何进一步调试吗?
发布于 2018-06-22 13:50:45
睡了一夜好觉后,我找到了解决办法。所有32位文件的名称中都有cpp,这暗示了它们必须支持c++。此外,对于32位目标文件,make的输出通过在行前加上CXX来指示c++编译器的使用。
因此,有两种方法可以解决这个问题。如果需要c++支持,修复方法是指示c++编译器生成64个二进制文件,方法是将CXXFLAGS=-m64添加到配置行:
./configure CXXFLAGS=-m64 CFLAGS=-m64 LDFLAGS=-m64另一种选择是禁用c++:
./configure --disable-cpp CFLAGS=-m64 LDFLAGS=-m64在我的情况下,我还不确定我想要什么,但这里有解决这个问题的方法。
https://stackoverflow.com/questions/50972566
复制相似问题