问题标签 [hotpatching]

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 投票
0 回答
151 浏览

gcc - 用户空间中的跳转标签修补

跳转标签补丁是 Linux 内核中一种允许分支优化的简洁机制。通常,一些分支检查不太可能改变的“静态”条件。这种机制的一个使用示例是在内核跟踪中,“if”语句将检查变量以确定是否应在跟踪点发出跟踪数据。而不是进行比较和分支,启用跟踪将简单地将“if”语句修补为无条件跳转,而禁用跟踪会将其修补为 aa nop。

更多信息:https ://lwn.net/Articles/412072/

我想知道这种机制是否也适用于用户空间。显然,所需要的只是编译器和硬件支持,因此没有明显的理由说明这也不适用于用户空间。

0 投票
1 回答
195 浏览

php - 如何应用热补丁来修复 symfony 项目中的错误?

我有一个使用 symfony3 的应用程序,一些客户使用它。我计划通过在线下载补丁代码来修复错误。

但是要知道,当补丁代码覆盖工程代码时,必须执行以下命令才能使补丁代码生效。

php php bin/console cache:clear --env=prod chmod -R 777 var/tmp

不幸的是,这个命令只能在cli模式下执行;

我该如何实现这个功能?

最后,请原谅我英语不好。:简单:

0 投票
1 回答
117 浏览

raku - 模块可以热补丁吗?

我希望能够在程序为我正在处理的项目运行时修补模块。我试过这个,但它不起作用:

有可能吗?如果是这样,我该怎么做?

0 投票
1 回答
173 浏览

ruby-on-rails - 在 nginx ruby​​ on rails 的热补丁期间,我可以通过服务器重启重新加载特定文件而不是整个应用程序吗?

有时由于错误/错误(主要在单个文件中),我必须对生产代码进行热补丁,但我已经设置eager_loadcache_classestrue。由于这两个原因,服务器加载大约需要 2 分半钟,热补丁也是如此。

我的最终目标是减少服务器加载时间。一种方法是为应用程序启动时不需要的 gem 添加“require:false”,然后在需要时加载它们。但是是否可以只重新加载更新的文件而不是重新启动整个应用程序?

我正在使用 nginx 免费服务器(企业版 nginx 版本可能是一种提供零停机时间的解决方案,但在该版本中是否可行?)

0 投票
1 回答
64 浏览

azure - Azure 应用服务实例历史和补丁更新版本

我有多个应用服务实例(不是虚拟机)。在门户中,我在哪里可以找到我的实例何时以及是否被修补(例如,在修补星期二)?有日志或报告吗?

0 投票
0 回答
38 浏览

ios - 有什么方法可以解决 iOS 应用程序的问题,而无需在 AppStore 上创建新版本?

我发现一个博客说我们可以远程修补生产中的错误和质量问题。无论您是否遇到 Apple 认可的重大问题。这意味着,通过添加访问应用程序功能并使用预定义解决方案修补它们的能力,您可以实时响应生产问题。这是现有的解决方案吗?提前致谢。

单击下面的链接以获取我阅读的博客。

https://www.cloudbees.com/blog/requesting-an-expedited-ios-app-store-review/

下面的屏幕截图来自该博客。

在此处输入图像描述

0 投票
0 回答
111 浏览

linux - linux process TEXT segment expansion

I am working with processes and i need to replace function in text segment, but if function will be larger then old it could overwrite something. So i wont to paste new function somwhere in virtual memory and then change pointers from old function. For example to put function in HEAP or make TEXT larger and add new function to the end of TEXT? Any ideas?

working with maps

0 投票
2 回答
126 浏览

assembly - 当带有指令的内存被另一个内核更改时,CPU 流水线会发生什么?

我试图了解 CPU 管道的“获取”阶段如何与内存交互。

假设我有这些说明:

如果 CPU1在 CPU2 执行这些相同的指令时写入00 48 c7 c3 04 00 00 00内存地址 8(即 64 位对齐)会发生什么情况?指令流会自动从 2 条指令变为 1 条指令,如下所示:

由于 CPU1 正在写入 CPU2 正在读取的同一内存,因此存在争用。写入会导致 CPU2 管道在刷新其 L1 缓存时停止吗?假设 CPU2 刚刚完成了对 的“获取”pĥase mov $2,是否会为了重新获取更新的内存而将其丢弃?

此外,将 2 条指令更改为 1 条指令时存在原子性问题。

我发现这个很老的文档 提到“指令获取单元在每个时钟周期从指令高速缓存中获取一个 32 字节的高速缓存行”,我认为这可以解释为每条指令从L1,即使它们共享相同的缓存行。但我不知道这是否/如何适用于现代 CPU。

如果以上是正确的,这意味着在获取mov $2到管道之后,下一次获取可能会在地址处获取更新的值e并尝试执行00 00( add %al,(%rax)),这可能会失败。

但是,如果 fetchmov $2带入mov $3“指令缓存”,那么认为下一次 fetch 只会从该缓存中获取指令(并 return mov $3)而不重新查询 L1 是否有意义?只要它们共享一个高速缓存行,这将有效地使这两条指令的获取原子化。

那么它是哪一个?基本上有太多的未知数,我只能推测太多,所以我真的很感激管道的 2 个获取阶段如何与它们访问的内存交互(变化)的逐个时钟周期细分。

0 投票
1 回答
103 浏览

c - Hot Patching 填充是否总是 16 的倍数?

使用选项/hotpatch/FUNCTIONPADMIN:195创建了一个 Windows 可执行文件,它将 195 字节的填充添加到 main() 的开头。

shellcode 在 main() 开始前 195 个字节被写入二进制映像。
反汇编后,显示有 13 个字节的额外填充(0xCC):

如果热补丁填充始终是 16 的倍数,shellcode 可以安全地使用任何额外的字节吗?

运行可执行文件,启动 Windows 计算器:
shellcode_calc_exe

0 投票
1 回答
156 浏览

x86 - 是否保证 x86 指令获取是原子的,以便用短跳转重写指令对于并发线程执行是安全的?

我认为热补丁假设用 2 字节跳转覆盖任何 2 或更多字节长的指令对于并发执行相同代码是安全的。

所以指令获取被假定是原子的。

考虑到前缀可能有超过 8 个字节的指令,并且它可以跨越任何对齐的边界,它确实是原子的吗?(或者热补丁是否依赖于函数开始的 16 字节对齐?如果是这样,那么大小超过 8 字节是什么意思?)


上下文:LLVM 拦截了https://github.com/llvm/llvm-project/blob/main/compiler-rt/lib/interception/interception_win.cpp中的 API 函数。这至少用于 Address Sanitizer,也可能用于其他用途。它将 HotPatch 实现为第 3 种方法(第 61 行):

MSVC 生成的二进制文件特意与此技术兼容。编译器/hotpatch选项可确保函数中的第一条指令至少为 2 个字节,/functionpadmin链接器选项可确保函数之间的间隙足以适应间接跳转。在 x86-64 上,这些选项无法识别,因为它们始终是隐含的。请参阅DebugBreak() 中的 break 指令 int 3 之前的 xchg ax,ax 的目的是什么?

我的印象是,HotPatch 还暗示了正在执行被拦截的函数时的安全性。然而,我正在查看的 API 拦截甚至没有尝试原子地编写跳转(第 259 行):

所以我想知道使热补丁对并发执行安全是否是一个目标,甚至是否可能。