为 asm 编译设置 PIC 标志
Set PIC flag for asm compiling
如何在 GCC 构建中为汇编器编译的 asm 设置 PIC 标志?
gcc -shared -o u.o -fPIC u.asm -Wa .....
会失败,正确的解决方法是什么?
编辑
事实上,我其实和这个case/knowledge没有任何关系。我只需要制作自己的 libffmpeg.so,因为这个 https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu 仅用于静态二进制构建指令。
所以尝试为每个添加 -fPIC 并通过 运行
将它们全部加起来
gcc -shared -o libffmpeg.so -Wl,--whole-archive lib/lib*.a -Wl,--no-whole-archive
感谢上帝一切顺利除了这个案例的错误
/usr/bin/ld: lib/libx265.a(cpu-a.asm.o): relocation R_X86_64_PC32 against symbol x265_intel_cpu_indicator_init' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: lib/libx265.a(pixel-util8.asm.o): relocation R_X86_64_PC32 against symbol x265_entropyStateBits' can not be used when making a shared object; recompile with -fPIC
所以我的最后一根稻草只是猜测哪个最接近上述实际问题
will fail
具体的错误信息是什么?
如果我尝试使用您的命令行,我的 GCC 版本会抱怨扩展名 .asm
,因为它不知道这是哪种文件类型。 GCC 中的汇编语言文件通常命名为 .s
(小写;而不是 .asm
);
或 .S
(大写)如果汇编代码应使用 C 预处理器进行预处理(因此 C 预处理器语句如 #define
、#include
、#ifdef
, #if
等可以在汇编代码中使用)。
我还假设您的命令行包含“-c
”;否则命令行将尝试编译 和 link 而不是只编译
How to set PIC flag for asm compiling by assembler in GCC build ?
正如 Nate Eldredge 已经写过的,这是不可能的:
-fPIC
告诉编译器如何将 C(或 C++、Fortran ...)代码翻译成 汇编代码。
如果您已经有了汇编代码,它要么是位置相关的,要么是位置无关的。
所以正确的问题是:“如何以与位置无关的方式为 x86-32 (或任何架构) 编写汇编代码?”
在这种情况下,“使用 -fPIC
重新编译”消息具有误导性。该消息假定有问题的目标文件是从 C/C++ 源代码编译的,在这种情况下 -fPIC
将导致编译器生成与位置无关的汇编代码。但这只是一个猜测,因为链接器实际上并不知道文件是如何产生的,在这种情况下,文件是由手写汇编组装而成的。 -fPIC
帮不上忙;它是一个编译器标志,此代码永远不会被编译。必须手动重写汇编代码以使其与位置无关,即不在任何地方使用绝对地址。
除非代码做了一些非常不寻常的事情,否则对于熟悉汇编语言的人来说这将是一项例行任务,但对于不熟悉汇编语言的人来说可能是一个项目。有几个不同的东西需要注意,我不知道是否有指南在一个地方解释所有这些东西。
也有可能有人已经写了这个文件的位置无关版本,或者可能已经写了 #ifdef
到 select 位置无关的代码。我自己没有看过文件。您可能应该做一些研究,看看是否存在将此库编译为共享库的支持;可能是有,只是你没有正确地做。
如何在 GCC 构建中为汇编器编译的 asm 设置 PIC 标志?
gcc -shared -o u.o -fPIC u.asm -Wa .....
会失败,正确的解决方法是什么?
编辑
事实上,我其实和这个case/knowledge没有任何关系。我只需要制作自己的 libffmpeg.so,因为这个 https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu 仅用于静态二进制构建指令。
所以尝试为每个添加 -fPIC 并通过 运行
将它们全部加起来
gcc -shared -o libffmpeg.so -Wl,--whole-archive lib/lib*.a -Wl,--no-whole-archive
感谢上帝一切顺利除了这个案例的错误
/usr/bin/ld: lib/libx265.a(cpu-a.asm.o): relocation R_X86_64_PC32 against symbol x265_intel_cpu_indicator_init' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: lib/libx265.a(pixel-util8.asm.o): relocation R_X86_64_PC32 against symbol x265_entropyStateBits' can not be used when making a shared object; recompile with -fPIC
所以我的最后一根稻草只是猜测哪个最接近上述实际问题
will fail
具体的错误信息是什么?
如果我尝试使用您的命令行,我的 GCC 版本会抱怨扩展名 .asm
,因为它不知道这是哪种文件类型。 GCC 中的汇编语言文件通常命名为 .s
(小写;而不是 .asm
);
或 .S
(大写)如果汇编代码应使用 C 预处理器进行预处理(因此 C 预处理器语句如 #define
、#include
、#ifdef
, #if
等可以在汇编代码中使用)。
我还假设您的命令行包含“-c
”;否则命令行将尝试编译 和 link 而不是只编译
How to set PIC flag for asm compiling by assembler in GCC build ?
正如 Nate Eldredge 已经写过的,这是不可能的:
-fPIC
告诉编译器如何将 C(或 C++、Fortran ...)代码翻译成 汇编代码。
如果您已经有了汇编代码,它要么是位置相关的,要么是位置无关的。
所以正确的问题是:“如何以与位置无关的方式为 x86-32 (或任何架构) 编写汇编代码?”
在这种情况下,“使用 -fPIC
重新编译”消息具有误导性。该消息假定有问题的目标文件是从 C/C++ 源代码编译的,在这种情况下 -fPIC
将导致编译器生成与位置无关的汇编代码。但这只是一个猜测,因为链接器实际上并不知道文件是如何产生的,在这种情况下,文件是由手写汇编组装而成的。 -fPIC
帮不上忙;它是一个编译器标志,此代码永远不会被编译。必须手动重写汇编代码以使其与位置无关,即不在任何地方使用绝对地址。
除非代码做了一些非常不寻常的事情,否则对于熟悉汇编语言的人来说这将是一项例行任务,但对于不熟悉汇编语言的人来说可能是一个项目。有几个不同的东西需要注意,我不知道是否有指南在一个地方解释所有这些东西。
也有可能有人已经写了这个文件的位置无关版本,或者可能已经写了 #ifdef
到 select 位置无关的代码。我自己没有看过文件。您可能应该做一些研究,看看是否存在将此库编译为共享库的支持;可能是有,只是你没有正确地做。