如何使用 -fPIC 标志重新编译 libperl.a 目标文件?

Håk*_*and 5 perl

这个问题是在尝试修复一些安装问题时出现QtCore4。在某些时候make尝试运行以下命令:

/usr/bin/c++  -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong \
 -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O3 -DNDEBUG  \
 -shared -Wl,-soname,QtCore4.so -o ../../blib/arch/auto/QtCore4/QtCore4.so \
 CMakeFiles/perlqtcore4.dir/binding.cpp.o \
 CMakeFiles/perlqtcore4.dir/handlers.cpp.o \
 CMakeFiles/perlqtcore4.dir/marshall_types.cpp.o \
 CMakeFiles/perlqtcore4.dir/util.cpp.o \
 CMakeFiles/perlqtcore4.dir/QtCore4.c.o \
 -lQtCore -lQtGui -lQtNetwork \
 /home/hakon/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux/CORE/libperl.a \
 ../../smokeqt/qtgui/libsmokeqtgui.so.3.0.0 \
 ../../smokeqt/qtnetwork/libsmokeqtnetwork.so.3.0.0 \
 -lpthread -lnsl -ldl -lm -lcrypt -lutil -lc -lQtGui -lQtNetwork \
 ../../smokeqt/qtcore/libsmokeqtcore.so.3.0.0 -lQtCore \
 ../../smokegen/bin/libsmokebase.so.3.0.0 \
 -Wl,-rpath,/home/hakon/Qt4-0.99.0/smokeqt/qtgui:/home/hakon/Qt4-0.99.0/smokeqt/qtnetwork:/home/hakon/Qt4-0.99.0/smokeqt/qtcore:/home/hakon/Qt4-0.99.0/smokegen/bin: 
Run Code Online (Sandbox Code Playgroud)

失败,来自链接器的以下错误消息:

/usr/bin/ld: /home/hakon/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux/CORE/libperl.a(toke.o): 
  relocation R_X86_64_PC32 against symbol `PL_curcop' can not be used when making
  a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

从错误信息,在我看来,该目标文件(这里toke.o)在 libperl.a被编译时-fPIC标志设置。

我现在的问题是:

  • 我怎样才能重新编译的目标文件libperl.a-fPIC
  • 这种重新编译是否会导致其他与 无关的问题 QtCore4(因为它很可能libperl.a会被与 无关的其他应用程序/程序使用(链接)QtCore4)?

我使用的是 Ubuntu 16.10 和 perl 版本 5.24.1。

rur*_*ban 4

如何使用 -fPIC 重新编译 libperl.a 中的目标文件

通过使用 -fPIC 标志重新编译 libperl.a。

./Configure -des -Accflags=-fPIC ...
Run Code Online (Sandbox Code Playgroud)

此重新编译是否会导致与 QtCore4 无关的其他问题(因为 libperl.a 可能会被与 QtCore4 无关的其他应用程序/程序使用(链接))?

是的。更喜欢共享的 libperl。-Duseshrplib

将 perl 嵌入到共享库中时需要它。您可以取消 ELF 上所需的 -fPIC 技巧,但共享的 libperl 使其变得更加容易。

  • 谢谢,这很好用。我使用以下命令:“perlbrew install perl-5.24.1 --as perl-5.24.1-PIC -Accflags=-fPIC”来保留单独的安装以用于测试目的。 (2认同)