问题标签 [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.

0 投票
1 回答
1181 浏览

hyperlink - 链接(GNU ld)重定位过程中R_386_PC32和R_X86_64_PC32有什么区别

在阅读《计算机系统:程序员的视角》第 7.7.1 节重定位条目这本书时:本节的简要内容是链接器如何在不同的目标文件中重定位引用。

编译和 objdump 示例源代码时:

然后gcc -Wall -c -o main.o main.c,然后objdump -S -r main.o > main.asm;并将看到交换的重定位条目:

所以当ld链接main.o和swap.o时,ld会使用swap(offset=7, type=R_386_PC32)的重定位入口r来确定链接地址:

而调用指令的操作数(fc ff ff ff)-4非常适合386指令集。

但是当我在 X86_64 Linux 中重复此操作时,我发现调用的代码是:

那么我的问题是为什么386中call(e8)的操作数是-4((fc ff ff ff),而X86_64 main.o中的操作数是00 00 00 00?是不是因为指令集不同(call vs .callq),还是只是 GNU ld 使用不同的算法来重定位 R_X86_64_PC32?

希望得到您的答复,非常感谢。

0 投票
1 回答
1710 浏览

solaris - 窥探 Solaris 10 软件包 - 重定位错误

我正在尝试在 Solaris 10 机器上运行 snoop。

默认情况下未安装 Snoop,我从 Solaris 10 cd 中获取了它。我安装的软件包是 SUNWrcmdc,因为 man snoop 显示它依赖于这个软件包。

现在,当我以 root 身份运行 snoop 时,出现以下错误:

ld.so.1: snoop: fatal: relocation error: file /usr/sbin/snoop: symbol dlpi_passive: referenced symbol not found

听起来像库路径错误。所以我做了一个

主机# ldd -r /usr/sbin/snoop

我选择了 libdlpi.so.1 的最新补丁,即补丁 145923-02 并应用了它。没有帮助。同样的问题。

我不知道如何处理这个“找不到符号:dlpi_passive”我不确定我还能尝试什么。

0 投票
2 回答
2308 浏览

gcc - 关于u-boot重定位功能的问题

u-boot-2011.12在我的OMAP3目标上使用,交叉工具链是CodeSourcery arm-none-linux-gnueabi,我编译u-boot,下载到目标并启动它,一切正常,但我对u-boot重定位功能有一些疑问,我们知道这个功能是基于PIC(位置独立代码),位置独立代码是通过将-fpic标志设置为 来生成的,但我在编译标志中gcc没有找到。fpic没有PIC,u-boot如何实现重定位功能?

0 投票
1 回答
1350 浏览

dynamic - 如何区分 .data.rel 部分中的可重定位符号和不可重定位符号

我正在尝试为准系统 ARM 应用程序创建一个简单的链接器。目前,加载模块的加载器只会将偏移量添加到.got.data.rel部分内的所有记录中。这适用于.got所有需要重定位的符号.data.rel。对于所有不可重定位的数据,它都会中断,因为这些数据也会得到这个偏移量。

例子:

这里a.fptr将正确处理函数的实际位置,但a.number会错误地持有0x1000 + offset,而不仅仅是0x1000.

我应该如何区分这两者?我检查该.symtab部分并仅重新定位在那里找到的地址就足够了吗?但是如果一个符号实际上是在 location0x1000呢?或者链接器是否解决了这个问题(所以它不会在 address 放置一个函数0x1000)?实际上是否.symtabs包含可以在.gotand中找到的所有符号.data.rel

0 投票
2 回答
115 浏览

c - 在符号表中包含有关静态变量的信息的目标是什么?

我正在尝试了解.symtab可重定位目标文件的设置类型。而且我知道,它包含有关静态变量的信息。但为什么?

将可重定位目标文件与其他文件链接所需要做的就是重新定位该静态变量的地址(当然还有其他一些,但对于静态变量无关紧要)。所以我们需要的只是重定位表,其中存储.rel.data并包含重定位静态变量的所有信息,不是吗?

0 投票
16 回答
111758 浏览

wordpress - 迁移后 Wordpress 不断重定向到 install-php

这是我的情况。我已按照 wordpress codex 页面上关于将站点移动到另一台服务器的确切说明进行操作。这是我采取的步骤。

  1. 导出我的数据库的副本
  2. 在新服务器中创建一个新数据库
  3. 导入我之前导出的数据库
  4. 通过 Ftp 上传我的 Wordpress 文件的副本
  5. 使用此脚本将我所有的本地 url 更改为新的
  6. 根据新服务器更改我的 wp-config.php 文件(我没有忘记表前缀。虽然它有一些大写字符)

然后当我尝试在新位置打开我的站点时,它只是将我定向到 wp-admin/install.php 现在只是为了使场景更清晰:目标文件夹(在实时服务器上)是 public_html 文件夹中的子目录里面已经安装了另一个wordpress(我这样说是为了以防万一)

我的 .htaccess 看起来像这样

我尝试通过 phpMyadmin 检查和修复我的表,但那里的一切似乎都很好,对问题没有影响。

我还尝试清空实时服务器上的数据库并完成安装。它安装没有问题,一切正常,但是,我没有用另一个干净的安装。但我认为这至少排除了 wp-config 文件的任何问题。我正在使用 Wordpress 3.3.1 版

所以我想我剩下的一个大问题是: 为什么 wordpress 在迁移后不能识别我的安装?

非常感谢任何帮助!

0 投票
1 回答
969 浏览

linux-kernel - 插入外部交叉编译的 SPARC Linux 模块时出现重定位错误

首先:我不是专家,所以请原谅我试图解释自己的任何错误。

我正在尝试使用 Sparc- 为 SPARC 机器交叉编译外部 Linux 模块Linux-GCC-4.4.2。Linux 内核的版本是2.6.36.4-00037-g059aa91-dirty. 它已经用LEON处理器的一些文件进行了修补。向我提供了构建流程,它使用LinuxBuildBuildrootBusybox. 我正在尝试制作 32 位操作系统。

一切似乎都正常,但是在我编译模块并尝试将其安装到 SPARC 系统后,我收到此错误:

这个错误来自于~/linuxbuild-1.0.3/linux/linux-2.6-git/arch/sparc/kernel/module.c 为了完整起见,我将提供整个方法:

因此,我了解默认情况是我所遇到的情况。ELF_R_TYPE(rel[i].r_info(SPARC Relocations) 类型在我的~/linuxbuild-1.0.3/dist/buildroot/build-br/staging/usr/include/elf.h文件中定义,其中一些类型如下:

所以重定位 6 对应于R_SPARC_DISP32akaPC相对 32 位。这在module.ccase 语句中定义,但仅限于 64 位部分。我想我要么需要自己编写重定位,要么弄清楚我需要什么重定位标志并在编译期间更改标志。我真的不明白重定位代码中发生了什么,所以请帮我弄清楚我应该如何解决这个问题。我不认为我可以将操作系统构建为 64 位,因为它似乎会破坏系统,所以请帮助我找到替代解决方案。

0 投票
1 回答
367 浏览

c++ - 为什么 shared-obj 中的 new&delete 运算符符号即使在该 shared-obj 中实现也要重新定位?

我试图在我的程序中实现我自己的 c++ new & delete 运算符,如下所示:

然后我发现,如果程序构建为: -- 一个 exe,那么我的 new/delete 会按预期调用 -- 但是,一个共享对象,那么 new & delete 的符号将被重新定位,所以在我的环境当它由 dlopen 在另一个程序中加载时,新的和删除的将被映射到另一个程序的新的和删除...

详细信息如下...

  1. 构建一个exe:

    gcc -m32 -c main.cpp gcc -m32 main.o -o main.exe

    $ ./main.exe 我的新被调用!我的删除被称为!

    $ objdump -d main.exe 080484ac :
    80484ac: 55 push %ebp
    80484ad: 89 e5 mov %esp,%ebp
    80484af: 53 push %ebx
    80484b0: 83 ec 24 sub $0x24,%esp
    80484b3: 83 e4 f0 和 $0xfffff0 ,%esp
    80484b6: b8 00 00 00 00 mov $0x0,%eax
    80484bb: 83 c0 0f 添加 $0xf,%eax
    80484be: 83 c0 0f 添加 $0xf,%eax
    80484c1: c1 e8 04 shr $0x4,%eax
    80484c4 : c1 e0 04 shl $0x4,%eax
    80484c7: 29 c4 sub %eax,%esp
    80484c9: c7 04 24 04 00 00 00 movl $0x4,(%esp)
    80484d0: e8 1f ff ff ff call 80483f4 <_Znwj> --> 新:预期!!
    80484d5: 89 c3 mov %eax,%ebx
    80484d7: 89 1c 24 mov %ebx,(%esp)
    80484da: e8 35 00 00 00 调用 8048514 <_ZN6ObjectC1Ev>
    80484df: 89 5d f8 mov %ebx,-0x8(%ebp)
    80484e2: 83 7d f8 00 cmpl $0x0,-0x8(%ebp)
    80484e6: 74 22 je 804850a
    80484e8: 8b 45 f8 mov -0x8(%ebp),%eax
    80484eb: 89 45 e8 mov %eax,-0x18(% ebp)
    80484ee: 83 7d e8 00 cmpl $0x0,-0x18(%ebp)
    80484f2: 74 16 je 804850a
    80484f4: 8b 45 e8 mov -0x18(%ebp),%eax
    80484f7: 89 04 24 mov %eax,(%esp)
    80484fa: e8 1b 00 00 00 调用 804851a <_ZN8466ObjectD 804851a <_ZN8466ObjectD>
    8451a <_ZNffObjectD e8 mov -0x18(%ebp),%eax
    8048502: 89 04 24 mov %eax,(%esp)
    8048505: e8 0a ff ff ff call 8048414 <_ZdlPv> --> 删除:预期

  2. 构建一个共享对象:

    gcc -m32 -c main.cpp gcc --shared -m32 main.o -o main.so

    $ objdump -d main.so 000006d4 :
    6d4: 55 push %ebp
    6d5: 89 e5 mov %esp,%ebp
    6d7: 53 push %ebx
    6d8: 83 ec 24 sub $0x24,%esp
    6db: 83 e4 f0 和 $0xffffffff0 ,%esp
    6de: b8 00 00 00 00 mov $0x0,%eax
    6e3: 83 c0 0f 添加 $0xf,%eax
    6e6: 83 c0 0f 添加 $0xf,%eax
    6e9: c1 e8 04 shr $0x4,%eax
    6ec : c1 e0 04 shl $0x4,%eax
    6ef: 29 c4 sub %eax,%esp
    6f1: c7 04 24 04 00 00 00 movl $0x4,(%esp)
    6f8: e8 fc ff ff ff call 6f9 ---> 新:要重新定位,意外 :(
    6fd: 89 c3 mov %eax,%ebx
    6ff: 89 1c 24 mov %ebx,(%esp)
    702: e8 fc ff ff ff call 703
    707: 89 5d f8 mov %ebx,-0x8(%ebp)
    70a: 83 7d f8 00 cmpl $0x0,-0x8(%ebp) 70e
    : 74 22 je 732
    710: 8b 45 f8 mov -0x8(%ebp),%eax
    713: 89 45 e8 mov %eax,-0x18(%ebp)
    716: 83 7d e8 00 cmpl $0x0,-0x18(%ebp)
    71a: 74 16 je 732
    71c: 8b 45 e8 mov -0x18(%ebp),%eax
    71f : 89 04 24 mov %eax,(%esp)
    722: e8 fc ff ff ff call 723 ---> 删除:要重新定位,意外:(
    727: 8b 45 e8 mov -0x18(%ebp),%eax
    72a: 89 04 24 mov %eax,(%esp)
    72d:e8 fc ff ff ff 调用 72e

0 投票
1 回答
91 浏览

arm - armlink 的类似选项“-BSymbolic”

为了减少重定位,可以在 gcc 工具链中使用“-BSymbolic” 。但是 armlink 怎么样?有类似的选择吗?

0 投票
1 回答
497 浏览

linker - 静态库中的 fPIC 代码:为什么?怎么了?

将位置无关代码放在静态库中会发生什么?(特别是在 x86-64 上)

也就是说:.o用PIC生成几个文件,放在一个.a文件中。这.a像往常一样静态链接到最终的可执行文件中。

它似乎有效,但这样做有意义吗?为什么?

最后的地址计算是怎么做的?(链接时间?运行时间?)

谢谢