制作PIE对象时,不能使用golang gcc c ++现有的静态库;用-fPIC

时间:2019-06-30 13:29:46

标签: c++ go gcc linker

我试图将现有的C ++库链接到代码。 C ++库只有一个静态库和一个头文件,没有源代码。

我使用swigc生成了libfoo.go,并编写了一个简单的libb.go来构建该库。这在较早的gcc-6的ubuntu 16.04上运行良好。

但是,一旦我升级到ubuntu 18,甚至使用旧的go1.9和gcc-6都可以正常工作,我就会遇到以下错误:

/usr/bin/ld: ./lib/libfoo.a(parser.o): relocation R_X86_64_32S against symbol `xmlSAX2IgnorableWhitespace' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: ./lib/libfoo.a(tree.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIC

我将go编译器和gcc都降级到了以前可以使用的版本。

以下是用于工作的libb.go

/*
#cgo CXXFLAGS: -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0 -w
#cgo CFLAGS: -I${SRCDIR}/include -w
#cgo LDFLAGS: -Wl -rpath,./lib, -L${SRCDIR}/lib -l:libfoo.a  -l:libxml2.a 
*/
import "C"

该如何解决?我搜索了一下,看来我不得不重新编译该静态库,对于我而言,这是不可能的。我试图将-no-pie参数传递给LDFLAGS,但这也不起作用。

1 个答案:

答案 0 :(得分:1)

这些天我也遇到了这个问题。最后,我发现在下面的行中添加

"env CGO_LDFLAGS=-no-pie"

去建立命令行可以解决这个问题。例如,

"env CGO_LDFLAGS=-no-pie go build -o main main.go"