问题标签 [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.
c - 为什么我不能用 -fPIE 编译,但可以用 -fPIC 编译?
我有一个有趣的编译问题。首先,请看要编译的代码。
我编译它并得到如下错误
在此之后,我修改了代码(删除了一行 [1]/使用 -fPIC 而不是 -PIE[2]),然后成功编译了这些代码。
为什么会发生这种现象?
我听说在使用 -fPIC 编译时通过 PLT 调用对象内的函数,但在使用 -fPIE 编译时直接跳转到函数来完成。我猜想带有 -fPIE 的函数调用机制会避免重定位。但我想知道准确和准确的解释。
你能帮我吗?
谢谢你们。
gdb - gdb重新编译后找不到断言失败位置
在我重新编译代码后,gdb 似乎无法找到断言失败的代码位置。更准确地说,我希望相对于断言失败的信号提升的位置是
相反,我得到
例如,考虑以下代码
用调试符号编译并用 gdb 调试。
第一次运行gdb,就找到了位置,回溯报错:
当我重新编译代码时,问题就来了。重新编译后,我在同一个 gdb 实例中发出运行命令。gdb 重新读取符号,从头开始启动程序,但没有找到正确的位置:
此时调试器无法使用。上不去,上前一步。作为一种解决方法,我可以手动重新加载文件,然后再次找到位置。
不幸的是,以这种方式重新加载文件后,gdb 无法重置断点。
ERRATA CORRIGE:我在使用 gdb 7.12.1 重置断点时遇到了失败。升级到 8.0.1 后问题消失了。据说,这与错误修复https://sourceware.org/bugzilla/show_bug.cgi?id=21555有关。但是,仍然无法正确找到断言失败的代码位置。
有人知道这里发生了什么吗?
这在系统更新后开始发生。系统更新重新编译了所有系统库,包括glibc,作为位置无关代码,即使用-fPIC 编译。
另外,我使用的 gcc 版本是 6.4.0
g++ - aarch64-elf-g++ -fPIC 为局部和全局符号提供不同的值
在windows 10下,使用交叉编译工具链linaro
,全名gcc-linaro-7.2.1-2017.11-i686-mingw32_aarch64-elf
(可上网搜索),编译如下代码片段:
代码不完整,因为我正在裸机环境中测试迷你内核。在上面的代码中,kout
只是将字符写入串行端口(使用硬件时raspberry pi 3
)或控制台(使用模拟器时QEMU
),但它不需要要完整,我想。无论如何,编译命令是aarch64-elf-g++ -fPIC test.cpp .... -o test
,并用于aarch64-elf-objcopy
生成kernel.test.img
,其中仅包含二进制代码,其他数据(如 elf 标头)被剥离。
在 QEMU 上运行它:qemu-system-aarch64 -machine virt,gic-version=3 -cpu cortex-a53 -smp 1 -m 1G -nographic -serial stdio -bios kernel.test.img
给出以下输出:
而您可以看到func address
与 相同local
,与local
不同global
,这完全不是我们所期望的。
核心问题是当你使用-fPIC
编译时,局部符号和全局符号在它们应该相同的时候却有不同的值。
也许aarch64-elf-g++
生成了错误的 .got
部分?但我不确定,谁能解释一下?
ubuntu - 在 c / 重定位 R_X86_64_32S 中编译 Makefile
今天我想用 Makefile 编译我的项目(我在 Ubuntu 17 中),但我有一个非常大的问题:
/usr/bin/ld: ./lib/my/libgnl.a(gnl.o): 重定位 R_X86_64_32S 反对 `.bss' 在制作共享对象时不能使用;重新编译 avec -fPIC /usr/bin/ld : échec de l'édition de liens finale : Section non-représentable sur la sortie collect2: error: ld returned 1 exit status Makefile:52 : la recette pour la cible « mysh » a échouée制作:*** [mysh] Erreur 1
我一直试图找到一个多小时的解决方案,但现在我开始失去它。(是的,我的 Makefile 中已经有了 -fPIC 标志)你能帮帮我吗?
有我的 Makefile :MAKEFILE part1 MAKEFILE part2
c++ - c++共享库fPIC或未定义库ubuntu 16.04
我正在尝试将代码编译为共享库(它在 Windows 上编译得很好,但我无法让它在 ubuntu 16.04 上编译)。
如果我尝试编译“在 Windows 上”,我会收到错误:
所以为了编译链接到我的代码的静态库,我添加了 -fPIC 选项(默认情况下它似乎在 Windows 上,但不是在 linux 上,但我不确定):
在我使用 qmake 编译的代码中,我添加了:
现在我得到这些错误:
ETC ...
如果我仅为我的代码添加 -fPIC 选项,而不是为编译它使用的静态库,我仍然会收到错误消息:
即使添加了 qmake_cxxflags -fPIC。
我在做什么错?*(我将 Make 文件放在这里以防万一:https ://github.com/pdeman/mevislabFetalMRI/blob/master/Makefile.CHUVTools.Release )
binary - 以 .a 和 .la 结尾的文件是什么意思?
我知道文件结尾对于 linux 上二进制文件的功能并不重要,但我想知道我从Nlopt遇到的两个文件结尾的含义
libnlopt.a 和 libnlopt.la 知道这些结尾是什么意思吗?我找到了这个资源,但它没有列出提到的结尾。
我想知道,因为我想弄清楚 libnlopt.a 是否是用 -fPIC 构建的,因为按照这里的第一个答案,库不是用 -fPIC 构建的,这很奇怪,因为在构建时我添加了选项到 ./configure(由 nlopt 提供)--with-pic。所以我想知道文件结尾是否意味着我必须走不同的路线才能确定它是否是用 -fPIC 构建的?
makefile - 使用 make 编译库返回错误 - 使用 -fPIC 重新编译(没有 ./configure 文件)
我正在尝试从 KDE(此处)编译 KArchive。显然我正在按照他们在安装文件中的说明进行操作。首先一切顺利,我只需要创建一个名为build的目录,并在其中使用它:
进展顺利。当我必须使用时出现问题make。运行后,我收到以下错误:
现在,这个问题并不少见,但大多数解决方案都对我不起作用。
c++ - mapreduce c编程无法与-fPIC链接,如何解决?
我有一个示例程序如下,在 ubunt 18.04 上使用 g++7.3.0 的 w.cpp
然后我编译它:
它给出了一个错误:
无论我添加或删除“-fPIC”标志,同样的错误。
c++ - -fPIC 标志 Cmake
我正在尝试使用 Cmake 构建一个共享库。但我面临这个错误:
我尝试以不同的方式将 -fPIC 标志添加到 cmake 文件:
和:
但我仍然再次遇到同样的错误。有谁能够帮我?