为 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 位置无关的代码。我自己没有看过文件。您可能应该做一些研究,看看是否存在将此库编译为共享库的支持;可能是有,只是你没有正确地做。