问题标签 [position-independent-code]
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.
assembly - 为什么具有对 _GLOBAL_OFFSET_TABLE_ 的非限定引用的 nasm 程序集显然可以组装和链接为 PIC?
为什么get_got.asm
当它包含对其 GOT 的绝对地址的引用时,我可以将其作为与位置无关的代码进行汇编和链接?
get_got.asm
主程序
组装、编译、链接、运行:
这里发生了什么?在我看来, get_got.so 不知何故有一个 GOT 的绝对地址,直到运行时才知道地址。反汇编 get_got.so 表明 mov 实际上包含一个立即数 (0x201000)。显然我对某事有一个重大的误解。我预计这会导致 nasm 生成链接器会阻塞的重定位。
macos - 判断共享库是否使用与位置无关的代码编译
有没有办法判断 OSX 共享库 ( .dylib
) 是否被编译为与位置无关的代码/可执行文件?
gcc - 如何将 gcc 配置为默认使用 -no-pie?
我想在 Linux 上编译以下程序:
但是,它给了我以下链接器错误:
我认为它不起作用的原因是因为 gcc-pie
默认使用生成共享对象。因此,使用-no-pie
修复它:
如何将 gcc 配置为-no-pie
默认使用?我正在使用 Arch Linux。
linker - PIE 程序的入口点地址
我如何知道 Linux/Android 上 PIE 程序的实际入口点地址?
我可以使用 读取入口点地址,但是对于使用orreadelf -l
编译和链接的精灵,实际的入口点地址将与它不同。如何在运行时获得这样的地址?也就是说,知道程序在哪里加载到内存中。-pie
-fPIE
arrays - 为什么我不能使用寄存器作为偏移量访问数组?
我正在编写一些汇编代码(英特尔),但我不明白为什么当我尝试创建共享库时这段代码不起作用:
而如果您通过使用数字更改寄存器来修改带有“mov”的行,则它可以工作:
我对 nasm 没有任何错误,但是当我尝试使用 ld 链接并创建共享库时:
重定位 R_X86_64_32S 对 `.data' 在制作共享对象时不能使用;使用 -fPIC 重新编译
我找到了“R_X86_64_32S”错误的答案:C++ 链接在实践中如何工作?
但是我不明白为什么我不能使用“rax”作为偏移量,而我可以使用数字。
有没有办法浏览思想数组?
这是我用来创建共享库的命令:
c++ - objdump 为使用和不使用 -fPIC 生成的目标文件提供相同的输出
我有两个文件,ah 和 a.cpp:
我在有和没有的情况下都编译了这个-fPIC
,然后objdump
都编辑了。奇怪的是,我得到了两个文件的相同输出。对于a()
,我在这两种情况下都得到了这个:
我也尝试用 编译目标文件-no-pie
,仍然没有运气。
c++ - 在cmake下为共享对象文件定位独立代码?
我们创建了一个共享对象文件并链接到我们的可执行文件:
我们注意到代码在没有 的情况下编译-fPIC
,但链接使用-fPIC
:
-fPIC
每个文件都需要标志吗?我们会在某个时候崩溃还是这样?
tensorflow - 构建 tensorflow 单元测试的问题
我需要在一些 XLA 通行证上运行测试,并且曾经bazel test
--config=opt --config=cuda //tensorflow/compiler/xla/service
这样做过(从这里)。构建失败并显示以下消息,暗示缺少 googletest 依赖项。
依赖项libgtest.a
和libgtest_main.a
是从 googletest 源构建的,并使用--linkopt=/path/to/file
.
添加-DCMAKE_CXX_FLAGS=-fPIC
没有帮助。如何更改 cmake 配置以使用 -fPIC 构建?
tensorflow (v1.8) 配置为由本地构建的版本 gcc (5.4) 构建,因为系统的版本 (5.5) 无法构建 tensorflow。那会是问题的原因吗?
linux - 在 Linux 中如何确定 PIE 可执行文件的文本部分的地址?
首先,我尝试对其进行逆向工程:
输出:
这表明它是0x555555554000
+ 随机偏移 + 63e
。
但后来我尝试 grep Linux 内核和 glibc 源代码555555554
,但没有成功。
哪个代码的哪一部分计算了那个地址?
我在回答时遇到了这个问题:gcc 和 ld 中与位置无关的可执行文件的 -fPIE 选项是什么?