【问题标题】:error building UDF mysql:relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC错误构建 UDF mysql:relocation R_X86_64_32 对 `.rodata.str1.1' 在制作共享对象时不能使用;使用 -fPIC 重新编译
【发布时间】:2017-05-22 23:15:01
【问题描述】:

我正在尝试使用 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

【问题讨论】:

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


    【解决方案1】:

    这里:

    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。

    从libpaillier.a 中提取目标文件paillier.o 以将其与libfoo.so 链接 与 not 提取它并简单地链接没有什么不同 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
    

    【讨论】:

    • 你说得对,效果很好,非常感谢
    • @Bochra 不客气 - 欢迎来到 Stackoverflow!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2018-03-31
    • 1970-01-01
    • 2017-07-22
    • 2016-06-06
    相关资源
    最近更新 更多