构建UDF mysql时出错:对`.rodata.str1.1'重定位R_X86_64_32制作共享对象时不能使用;用-fPIC重新编译

时间:2017-05-22 23:15:02

标签: mysql shared-libraries rake user-defined-functions udf

我尝试使用rake构建UDF库:

task :compile do
    system("gcc -L/usr/local/lib -lgmp -lpaillier `mysql_config --cflags` -c -fPIC #{FILE}.c")
    system("ar -x /usr/local/lib/libpaillier.a")
    system("gcc -shared *.o -L/usr/lib/x86_64-linux-gnu/ -lgmp -o #{LIBFILE}")
    system("sudo mv #{LIBFILE} /usr/lib/mysql/plugin/")
end

但我收到此错误:

/usr/bin/ld: paillier.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
paillier.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:0)

下面:

gcc -L/usr/local/lib -lgmp -lpaillier `mysql_config --cflags` -c -fPIC #{FILE}.c

您正在编译一个名称为#{FILE}.o的对象文件 - 假设它是aa.o - 您正在使用与位置无关的代码进行编译 (-fPIC)。你的链接器标志:

-L/usr/local/lib -lgmp -lpaillier

在这里没有任何用处,因为没有进行任何链接而被忽略。

下面:

ar -x /usr/local/lib/libpaillier.a

您要从静态库/usr/local/lib/libpaillier.a中提取所有目标文件。事实上只是 库中的一个目标文件paillier.o

下面:

gcc -shared *.o -L/usr/lib/x86_64-linux-gnu/ -lgmp -o #{LIBFILE}

您正在构建一个共享库,其名称将是#{LIBFILE}的值 - 假设它是libfoo.so - 链接目标文件aa.opaillier.o, 加libgmp

paillier.o提取目标文件libpaillier.a,将其与libfoo.so相关联 与提取它并简单地链接没有什么不同 libpaillier.a本身,即没有什么不同:

gcc -shared #{FILE}.o -L/usr/local/lib -lpaillier -L/usr/lib/x86_64-linux-gnu/ -lgmp -o #{LIBFILE}

链接库路径:

-L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/

是超级的,因为这两个路径都是系统上的默认链接器搜索路径。

共享库必须完全由PIC对象代码构建。编译了aa.o 在第一步中使用-fPIC。但是,paillier.o并非如此。因此链接失败并且链接器失败 建议您paillier.o必须使用-fPIC进行重新编译。

这样做: -

删除现有的/usr/local/lib/libpaillier.a/usr/local/include/paillier.h

返回您的libpaillier源目录(第一次构建它)。

清理它:

$ make clean

重新配置autotools构建系统以编译PIC代码:

$ ./configure CFLAGS=-fPIC [and whatever other options you used before]

重建:

$ make

重新安装:

$ sudo make install

现在你又有一个标题/usr/local/include/paillier.h和 这是一个静态库/usr/local/lib/libpaillier.a 库中的paillier.o是PIC代码。

然后你可以用:

构建你的插件
task :compile do
    system("gcc `mysql_config --cflags` -c -fPIC #{FILE}.c")
    system("gcc -shared #{FILE}.o -lpaillier -lgmp -o #{LIBFILE}")
    system("sudo mv #{LIBFILE} /usr/lib/mysql/plugin/")
end