我尝试使用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
答案 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.o
,paillier.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