首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不同寄存器上的R_MIPS_HI16/R_MIPS_LO16对

不同寄存器上的R_MIPS_HI16/R_MIPS_LO16对
EN

Stack Overflow用户
提问于 2020-03-22 06:27:18
回答 1查看 186关注 0票数 0

我试图了解R_MIPS_HI16和R_MIPS_LO16在mips中是如何工作的。

我编写了一些c代码:

代码语言:javascript
运行
AI代码解释
复制
static char buf1[0x100];
static int a = 0;
static int b = 0;

char f(int i, int n)
{
    a++;
    b++;
    return buf1[n];
}

mips-linux-gnu-gcc-8 -o test.o -c -O2 -G 0 -g test.c编译并运行objdump:mips-linux-gnu-objdump -d -j .text test.o

我得到以下信息:

代码语言:javascript
运行
AI代码解释
复制
00000030 <f>:
  30:   3c070000    lui a3,0x0
  34:   3c060000    lui a2,0x0
  38:   3c020000    lui v0,0x0
  3c:   8ce50004    lw  a1,4(a3)
  40:   8cc30000    lw  v1,0(a2)
  44:   24420008    addiu   v0,v0,8
  48:   00442021    addu    a0,v0,a0
  4c:   24a50001    addiu   a1,a1,1
  50:   24630001    addiu   v1,v1,1
  54:   80820000    lb  v0,0(a0)
  58:   ace50004    sw  a1,4(a3)
  5c:   03e00008    jr  ra
  60:   acc30000    sw  v1,0(a2)

现在我运行mips-linux-gnu-readelf -r test.o以获得重新定位表:

代码语言:javascript
运行
AI代码解释
复制
Relocation section '.rel.text' at offset 0x79c contains 12 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000008  00000405 R_MIPS_HI16       00000000   .bss
00000018  00000406 R_MIPS_LO16       00000000   .bss
00000014  00000405 R_MIPS_HI16       00000000   .bss
0000001c  00000406 R_MIPS_LO16       00000000   .bss
00000030  00000405 R_MIPS_HI16       00000000   .bss
0000003c  00000406 R_MIPS_LO16       00000000   .bss
00000040  00000406 R_MIPS_LO16       00000000   .bss
00000038  00000405 R_MIPS_HI16       00000000   .bss
00000044  00000406 R_MIPS_LO16       00000000   .bss
00000058  00000406 R_MIPS_LO16       00000000   .bss
00000034  00000405 R_MIPS_HI16       00000000   .bss
00000060  00000406 R_MIPS_LO16       00000000   .bss

现在,根据ABI第4-17节,每个R_MIPS_HI16重新定位都有一个匹配的R_MIPS_LO16.如果前面有一个没有R_MIPS_LO16的R_MIPS_HI16,它将引用之前的R_MIPS_HI16。

如果我理解得对,这就意味着38和44的重新定位是成对的。在地址38中,我们将地址的较高部分移动到寄存器(v0),在44中,我们添加到相同的寄存器中,以完成地址的加载。

我不明白的是,58中的重新定位也耦合到同一个R_MIPS_HI16,但在这个地址中,我们没有访问以前命令中使用的任何寄存器,它们似乎也没有关联。实际上,这个命令似乎与对30和3c相关。

这里发生什么事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-22 07:02:20

您正在观察a++b++的优化。

虽然人们可能认为b = b + 1包含一个b负载和一个b存储,需要lui/lw对来读取blui/sw对来写入b,但是编译器知道,对b的读取和b的写入都需要相同的lui,因此它消除了第二个lui,重用了第一个lui的目标寄存器--因此它正在执行lui/lw/sw

如果你是手动写这个的话,还有一个小程序。对于所有的全局变量,您可以使用/共享一个lui

但是由于这些变量被分配给.bss (它们都是零初始化的),链接器决定它们的最终位置(尽管它们在源程序中一起声明,但它们是单独的项),所以我们实际上不知道它们在编译时的距离有多近。

此外,由于这是一个程序片段,我们也不知道程序总共将有多少个全局值,因此,在任意两个全局之间可能会出现64k的边界,这意味着这两个全局将需要不同的lui

由于最终的确定是由链接器完成的,编译器在这里假设最坏的情况,并对每个全局变量使用一个单独的lui

经过一番讨论..。

我明白你的意思了。我告诉你们的是,30,3c和58与变量的相同访问有关,这是正确的。搬迁,我不熟悉,但你可能会发现这相关:

https://github.com/NationalSecurityAgency/ghidra/issues/909

虽然我理解解释ABI的方式,但HI16不影响LO16重新定位修复,但是我们目前的实现只有影响HI16修复的LO16,因为在HI16计算过程中可能会进入前16位。

底线是,虽然HI16需要与LO16配对才能计算进位,但如果没有前面的HI16,则以前配对的LO16的重复是可以的,因为已经完成了进入HI16的适当进位--因此HI16/LO16的重新定位并不是真正的配对1:1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60800531

复制
相关文章
kubernetes | pod
基于centos7.9,docker-ce-20.10.18,kubelet-1.22.3-0
Amadeus
2022/10/25
6070
Kubernetes Pod基础
Pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,k8s不会直接处理容器,而是Pod,Pod是由一个或者多个container组成的。
kubernetes中文社区
2019/06/24
7450
Kubernetes Pod详解
Pod中通过共享Network Namespace的方式进行网络的共享,但是如果是以下方式进行Network Namespace共享会有问题:
shysh95
2022/05/24
7970
Kubernetes Pod详解
【Kubernetes系列】Pod
Pod是一组(一个或多个) 容器 ; 这些容器共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。
Java技术债务
2022/10/28
6060
Kubernetes Pod Evicted[通俗易懂]
近日 Kubernetes 测试集群 Pod 状态出现 Evicted 现象 , 但是项目还是能正常提供服务 , 最先的解决办法是手动将 Evicted 状态的 Pod 删除。
全栈程序员站长
2022/08/30
1.1K0
Kubernetes Pod 突然就无法挂载 Ceph RBD 存储卷了。。
之前在 Kubernetes 集群中部署了高可用 Harbor 镜像仓库,并使用 Ceph RBD 提供持久化存储。本来是挺美滋滋的,谁料昨天有一台节点 NotReady 了,导致 Harbor 的某个组件所在的 Pod 被重新调度了,但是重新调度后的 Pod 并没有启动成功。
米开朗基杨
2021/01/14
2.9K0
Kubernetes Pod 突然就无法挂载 Ceph RBD 存储卷了。。
git将本地代码上传仓库(gitlab克隆代码到本地)
这样,把文件添加到git本地管理目录中,这类似Svn的add操作,实际上,还没有提交到本地管理仓库。利用
全栈程序员站长
2022/08/02
1.6K0
【iOS】将代码上传到pod创库
可以看到我们指定source_files指定在PPKit/Classes文件夹下的所有文件,所以我们的源码都放在这里就可以了
MapleYe
2020/03/30
8200
【iOS】将代码上传到pod创库
ELK学习笔记之filbeat pod无法将容器日志发送
题目:ELK学习笔记之filbeat pod无法将容器日志发送到Elasticsearch7.8 reconnect to backoff with 9 reconnect attempt(s)
Jetpropelledsnake21
2020/08/02
6240
使用 iptables 将 Kubernetes Service 流量随机发送到 Pod
本文将带大家了解 Kubernetes 的 kube-proxy 组件如何使用 iptables 将 service 流量随机发送到 Pod,目的是实现 service 所需的 iptables 规则。
CNCF
2021/04/21
1.7K0
Kubernetes 1.19.0——Pod(1)
kubectl run 名字 -image=镜像 --labels=”aa=bb,aa2=bb2...” --env=”k1=v1” --port=80 --image-pull-policy=策略
gz_naldo
2020/09/18
6960
Kubernetes 1.19.0——Pod(1)
Kubernetes 1.19.0——Pod(2)
所谓静态pod就是,不是master上创建的,而是需要到Node的/etc/kubelet.d/里创建一
gz_naldo
2020/09/19
7322
Kubernetes 1.19.0——Pod(2)
2.1 Kubernetes--Pod
  自主式Pod是不被控制器管理的Pod. 这种Pod死亡以后, 不会被重新启动. 这个Pod死了以后, 副本数就达不到期望值了, 也不会有人去创建一个新的Pod为达到副本数的期望值.
用户7798898
2020/09/27
7850
2.1 Kubernetes--Pod
kubernetes中的pod
在Kubernetes中,Pod是最小的可部署单元。Pod是一个逻辑主机,它可以包含一个或多个容器。每个Pod都有一个唯一的IP地址和一组共享的存储和网络资源。Kubernetes使用Pod来调度和管理应用程序的运行。
玖叁叁
2023/04/28
5880
Kubernetes 系列(3) —— Pod
Pod 是 Kubernetes 的基本操作单元,也是应用运行的载体,包含一个或多个密切相关的容器。整个 Kubernetes 系统都是围绕着 Pod 展开的,比如如何运行 Pod、如何保证 Pod 的数量,如何访问 Pod 等。
求和小熊猫
2021/09/10
9820
Kubernetes Pod 驱逐详解
在 Kubernetes 中,Pod 使用的资源最重要的是 CPU、内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO)。可压缩资源不可能导致 Pod 被驱逐,因为当 Pod 的 CPU 使用量很多时,系统可以通过重新分配权重来限制 Pod 的 CPU 使用。而对于不可压缩资源来说,如果资源不足,也就无法继续申请资源(内存用完就是用完了),此时 Kubernetes 会从该节点上驱逐一定数量的 Pod,以保证该节点上有充足的资源。
米开朗基杨
2019/08/29
3.3K0
Kubernetes Pod 驱逐详解
Kubernetes Pod 全面知识
Pod 是在 Kubernetes 中创建和管理的、最小的可部署的计算单元,是最重要的对象之一。一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络、存储等环境。
痴者工良
2021/11/30
8570
Kubernetes Pod 全面知识
Kubernetes Pod入门指南
Pod是Kubernetes项目里定义的最小可调度单元,是Kubernetes对应用程序的抽象。在这篇文章里我将会介绍Kubernetes里Pod的基本概念,使用方式,生命周期以及如何使用Pod部署应用。读这篇文章的朋友我会默认你已经了解Kubernete是用来解决什么问题的,以及电脑上已经安装了Minikube这个能试验Kubernetes功能的工具。如果尚未做好这些准备工作,推荐先去看下面的两篇文章做好准备工作后再来学习这里的内容。
KevinYan
2020/08/10
4840
Kubernetes通过端口转发映射本地端口到指定的Pod应用端口
使用资源类型/名称,如deployment/mydeployment来选择pod。如果省略,资源类型默认为'pod'。
院长技术
2021/01/06
3.2K0
Kubernetes Pod OOM 排查日记
在一次系统上线后,我们发现某几个节点在长时间运行后会出现内存持续飙升的问题,导致的结果就是Kubernetes集群的这个节点会把所在的Pod进行驱逐OOM;如果调度到同样问题的节点上,也会出现Pod一直起不来的问题。我们尝试了杀死Pod后手动调度的办法(label),当然也可以排除调度节点。但是在一段时间后还会复现,我们通过监控系统也排查了这段时间的流量情况,但应该和内存持续占用没有关联,这时我们意识到这可能是程序的问题。
yoyofx
2020/08/10
2.7K0

相似问题

如何修改DOCKERFILE,将wget安装到kubernetes pod中?

21

将本地目录挂载到kubernetes pod

20

将本地目录托管给Kubernetes Pod

10

如何将配置文件安装到Kubernetes Pod中?

15

kubernetes将本地文件添加到pod

4185
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文