【问题标题】:compiling pcre 3.38 as 64bit on Solaris 10 - wrong ELF class在 Solaris 10 上将 pcre 3.38 编译为 64 位 - 错误的 ELF 类
【发布时间】:2018-06-21 15:40:23
【问题描述】:

我正在尝试将 Solaris 10 上的 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

检查什么是战争,我看到主要是 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 应该解决这个问题。

知道如何进一步调试吗?

【问题讨论】:

    标签: 64-bit pcre solaris-10


    【解决方案1】:

    睡了一夜好觉后,我找到了解决办法。所有 32 位文件的名称中都有 cpp,暗示它们与 c++ 支持有关。此外,32 位目标文件的 make 输出通过在行前加上 CXX 前缀表示使用 c++ 编译器。

    所以有两种方法可以解决这个问题。如果需要 c++ 支持,解决方法是通过在配置行中添加 CXXFLAGS=-m64 来指示 c++ 编译器生成 64 个二进制文件:

    ./configure CXXFLAGS=-m64 CFLAGS=-m64 LDFLAGS=-m64
    

    另一个选项是禁用 c++:

    ./configure --disable-cpp CFLAGS=-m64 LDFLAGS=-m64
    

    在我的情况下,我还不确定我想要什么,但这里有解决这个问题的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 2016-01-17
      • 1970-01-01
      相关资源
      最近更新 更多