问题标签 [fpic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2206 浏览

c++ - 有什么方法可以找出使用 -fPIC 标志编译的静态库

我手头有一堆静态库,它们都有两个版本——32 位和 64 位。当我用这些静态库编译成共享库的时候,奇怪的事情发生了: 1、我用64位的静态库编译了一个64位的共享库,一切正常;2.我用32位静态库编译了一个32位共享库,ld告诉我[text section is not shareable]。

所以,我猜 32 位静态库不使用 -fPIC 标志,但我的同事告诉我他添加了标志。但我仍然怀疑,有没有办法找出静态库是否添加了 -fPIC 标志。PS:我知道使用 readelf 或 objdump 可能会得到一些线索,但有没有更好的方法?

0 投票
2 回答
995 浏览

makefile - caffe 重新编译时出现 -fPIC libglog.a 错误

我正在尝试在 Debian 上安装 Caffe,但是当我这样做时make all出现此错误:

/usr/bin/ld: /usr/local/lib/libglog.a(logging.cc.o): 重定位 R_X86_64_32 反对 `.rodata' 在制作共享对象时不能使用;使用 -fPIC 重新编译

/usr/local/lib/libglog.a:无法读取符号:错误值

collect2:错误:ld 返回 1 退出状态 make:*** [.build_release/lib/libcaffe.so] 错误 1

我应该在哪里添加-fPIC标志?我还读到这还不够gflags

有什么建议么?

0 投票
0 回答
170 浏览

file - -fpic 不适用于汇编文件

我使用具有 LOCAL_CFLAGS 的 android.mk 文件构建了一个共享库:- -fPIC

并使用 ndk-build r10e 版本构建。

程序集文件包含 arm11 程序集。

当我使用 eu-findtextrel 实用程序检查时,它仍然显示重新定位的文本。

有没有办法对汇编文件强制执行 fPIC?

提前致谢。

0 投票
0 回答
324 浏览

tcl - 错误:尝试 ./configure && make package nap 时使用 -fPIC 重新编译

我正在尝试为 tcl 配置和制作安装包 nap6.4,但它在“制作”期间失败并出现以下错误:

所以我被告知要使用 -fPIC 重新编译,我在终端通过以下方式进行了编译:

但这不起作用。我也尝试过使用 --disable-shared、make clean 和

以及其他不工作的 CFLAGS 版本。

所以我想知道如何使用 -fPIC 重新编译?我在这里缺少一些特殊的语法吗?

0 投票
0 回答
546 浏览

c - 创建 ARM flat pic 二进制文件

我想编写一个包含数据的位置相关代码。

这意味着,一个函数可以获取 printf 的绝对地址并打印一个简单的字符串。

我已经设法通过使用带有参数-fPIC的 arm-none-eabi-gcc编译 ELF 来实现这一点。问题是使用objcopy将 ELF 文件转换为平面二进制文件。

objcopy将字符串放在文件的顶部,从而使数据不再独立于位置,而不是将字符串留在函数末尾,由程序计数器寻址。

我错过了什么吗?objcopy 是否可以创建具有位置无关数据的平面二进制文件?

编辑:

可以在附图中看到字符串位于我的函数上方的绝对地址中,而不是在它的末尾并由 PC 指向

0 投票
0 回答
645 浏览

c - 如何解决此 libtool 链接错误

用于链接的命令:

错误:

0 投票
2 回答
1462 浏览

linux - 将非 PIC 对象链接到具有 PIC 对象的可执行文件是否有效

我正在将一个线程局部变量添加到几个始终直接链接到可执行文件的目标文件中。这些对象永远不会包含在共享库中(可以肯定地假设这在可预见的将来会成立)。这意味着这些对象不需要 -fPIC 标志,对吗?

默认情况下,我们的代码库对所有对象都有 -fPIC 标志。其中许多都包含在共享库中,因此使用 -fPIC 是有意义的。但是,此标志在调试新线程局部变量时会出现问题,因为GDB 在使用 -fPIC 跨过线程局部变量时会崩溃。如果我使用新的线程局部变量从这几个目标文件中删除 -fPIC,我可以正确调试。

我找不到任何权威性的声明表明在可执行文件中将非 PIC 对象与 PIC 对象混合是可以的。到目前为止,我的测试表明它还可以,但感觉不干净,由于共享库的情况,在线讨论通常是“不要混合 PIC 和非 PIC”。

在这种情况下,将非 PIC 对象链接到使用 PIC 对象和库构建的可执行文件是否安全?也许 GCC 文档有一个关于这是安全的权威声明,但我找不到它。

编辑:二进制修补 gcc 以避免此错误在短期内不是解决方案。在 Linux 上切换编译器不是一个可行的解决方案。

0 投票
2 回答
1155 浏览

linux - 使用“-fPIC”标志编译可执行文件(无共享库)

我目前正在处理一些遗留包,我看到一些Makefiles 使用该-fPIC标志来编译最终的可执行文件。

我的理解是,这是在创建共享库时使用的,在创建可执行文件时使用它是没有意义的。

我想知道我是对的还是我遗漏了什么,因为当我在互联网上搜索时,我只得到关于共享库而不是可执行文件的结果。

谢谢,

0 投票
3 回答
3139 浏览

linux - 如何在Linux上将-fPIC传递给GCC

我正在尝试使用 GCC 5.3 在 linux 上编译 libedit,并收到一条神秘的错误消息。

指的是什么recompile with -fPIC,ncurses 或 libedit?然后我如何传递-fPIC标志。我已经尝试添加CFLAGS=-fPIC到配置ncurses & libedit但仍然没有工作。

我发现可能会在 SO 上发布关于 -fPIC 是什么的帖子,但没有关于如何设置标志的帖子。

谢谢艺术

0 投票
1 回答
309 浏览

thrift - 如何使用 -fPIC 构建节俭

我有一些理由将 libthrift.a/libthriftnb.a 打包到共享库中(而不是直接使用 so 文件),所以我应该使用 -fPIC 构建它们。

我像这样建立节俭:

我该如何改变才能实现这一目标?