问题标签 [relocation]
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.
shared-libraries - 如何为裸机臂应用程序编写动态加载程序
我正在开发一个基于 arm9 处理器的项目。我们只使用没有任何操作系统的裸机,所以很遗憾我们还不支持共享库/动态加载器。
我希望能够从 SD 卡加载库,它也可以从主应用程序调用函数。
我的第一次尝试是使用链接器覆盖功能(将库放置在特定的绝对定位部分中),但是正如我之前提到的那样,调用主应用程序函数存在问题->每次更改主应用程序时都必须重新编译库能够回调。
根据这一点,我将不得不编写自己的动态加载器,但我是这方面的新手。请有人给我任何例子如何处理它或如何开始这样的项目?我们使用 gcc 作为 arm-elf 目标。
问候简
linux - 重定位错误和 Linux 软件分发
这是我的目标:我在 Linux 中开发软件,我需要在没有源代码的情况下分发它。这个想法是创建一个 zip 文件,其中包含运行可执行文件所需的所有项目。用户将下载 zip,解压缩,双击,软件将在任何基于 Linux 的机器上启动。对于我不会解释的动机,我不能使用 deb/rpm/etc 或安装程序。
sw 具有以下依赖项:
- 一些库(由我自己编写,依赖于 OpenCV),用 g++ 编译,创建 .a 文件(即静态库)
- OpenCV,在共享库中,有几个依赖项
我用 gcc 编译我的程序,并将其链接到:
然后我做:
我复制了./lib 中列出的所有库,并创建了.zip。
我将 zip 复制到另一台机器上,ldd my_exe
满足列出的依赖项并正确指向 ./lib 但是当我启动程序时,出现以下错误:
怎么了?我的错误在哪里?
一些附加信息:
我正在使用 gcc 4.4.5,带有内核 2.6.35 SMP,64 位的 Ubuntu。我尝试的机器也是 64 位 SMP 内核 2.6。
portable-executable - 那么大部分二进制是由reloc表组成的吗?
我只是用来objdump -x ...
检查 PE 文件的部分。
大约有 90,000 行 reloc 条目:
大多数 PE 文件的大部分空间都是由上面的 reloc 条目组成的,这是否成立?
这些条目是做什么用的?
更新
任何人都可以解释重定位条目如何像上面那样工作?
c++ - 使用 g++ 编译时重定位被截断以适应错误
我试图在linux下编译一段cpp代码,得到如下错误:
我的操作系统:Ubuntu 10.10
g++:gcc 版本 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
以前有人遇到过这个错误吗?谢谢。
程
c - R_X86_64_32S 和 R_X86_64_64 重定位是什么意思?
当我尝试在 64 位 FreeBSD 中编译 C 应用程序时出现以下错误:
relocation R_X86_64_32S 制作共享对象时不能使用;使用 -fPIC 重新编译
什么是R_X86_64_32S
搬迁,什么是搬迁R_X86_64_64
?
我已经用谷歌搜索了这个错误,这可能是原因 - 如果有人能说出 R_X86_64_32S 的真正含义,那就太好了。
linux - 为什么 -r 选项(可重定位)使 ld 找不到任何库?
使用 GNU ld 2.21 运行 Debian/Linux x86_64。
很简单,如果我链接到
它有效,但是当我链接时
它抱怨
我实际上并没有尝试以这种方式编译代码,而是试图弄清楚为什么其他人的测试以查看库是否存在不起作用。(因此我不太明白发生了什么ld
……通常我只是使用 GCC 来链接)
为什么告诉ld
以可重定位方式链接会使其突然无法找到库?如果我只是想测试它的-lm
存在,我应该怎么做
这样它会找到图书馆?
如果你想看我正在处理的源码,你可以在这里下载:https ://github.com/jeremysalwen/ESPS (注意,第一次提交是原始源代码,后面的都是更改我亲手制作的。)
static-libraries - 使用 libtool 时避免链接静态库
我正在尝试在 linux 机器上交叉编译 ImageMagick。工具链自带的 libstdc++.a 不是用 fPIC 编译的。我想改用so文件。但是 libtool 不断链接 libstdc++.a (作为整个档案),我得到重定位错误。我在其他图书馆也看到了同样的问题。有任何想法吗?
linux - 共享库中的重定位条目
我正在调查共享库的重新定位,并遇到了一些奇怪的事情。考虑这段代码:
我将它编译为一个非 PIC共享库gcc -shared
。我在 x86 上运行的 32 位 Ubuntu 上执行此操作。
结果.so
有一个用于调用ml_util_func
in的重定位条目ml_func2
。这是objdump -dR -Mintel
on的输出ml_func2
:
注意指令中的R_386_PC32
重定位。call
现在,我的问题是为什么需要搬迁?e8
是 x86 上的“调用相对...”,并且由于ml_util_func
在同一个对象中定义,链接器肯定可以计算它与调用之间的相对偏移量而不会将其留给动态加载器吗?
有趣的是,如果ml_util_func
被声明static
,重定位就会消失,链接器会正确计算并插入偏移量。什么是也ml_util_func
被导出使链接器懒惰呢?
PS:我故意使用非 PIC 代码,以了解加载时重定位。
assembly - 使用 RIP 寻址,为什么 x86-64 仍需要重定位?
所以 x86-64 具有 RIP 相对寻址,这使得 PIC 代码易于编写,并且需要的重定位少得多。为什么在 x86-64 上仍然需要重定位?对于什么功能?我可以尝试探索,objdump
但是要编译查看哪些 C/C++ 代码模式?
c++ - C++如何控制LoadLibrary API的Image Base
在它自己的镜像库中重新定位主程序非常高之后。
如何保证加载的 dll 将加载到 0x400000
我总是得到 0x460000 而不是 0x400000
我需要我的 dll 第一条指令从 0x401000 开始,它曾经在变基之前从 0x600000 开始
链接器变基的命令是
所以 0x400000 现在实际上是免费的,但默认情况下它不使用它。所以我可以通过任何方式控制它,它应该重新定位。也许一些WIN32API?