我有一个包含错误的可执行文件(C++,i386,在 MacOS/X Tiger 下编译,如果重要的话)。该错误的修复很简单——代码中有一个地方调用 fork() 而它不应该。因为修复很简单,而且因为此时从头开始重新编译可执行文件会很困难(不要问),我想直接修补可执行文件/二进制文件。
作为迈出的第一步,我在我的可执行文件上运行了“otool -tV MyExecutableName”,瞧,我在反汇编输出中发现了这个:
./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d subl $0x10,%esp
0002ce10 calll 0x0051adac
0002ce15 movzbl 0x14(%ebp),%esi
0002ce19 calll 0x00850ac9 ; symbol stub for: _fork
0002ce1e cmpl $0x00,%eax
0002ce21 jll 0x0002cf02
0002ce27 jle 0x0002ce34
[... many more lines omitted ...]
Run Code Online (Sandbox Code Playgroud)
所以我想做的是替换第 0002ce19 行的操作码,这样它就不会调用 _fork,而是无条件地跳转到失败情况(即它应该像 fork() 返回 -1 一样)
不幸的是,我在反汇编/二进制补丁方面是一个完全的新手,所以我不确定如何去做。特别是,我的问题是:
1)我应该将哪些字节写入位置 0002ce19 到 0002xe1d 以获得我想要的?我假设它是“jmp 0x0002cf02”的组装等价物,但我如何弄清楚这些字节是什么?
2) "otool -tV" 打印的偏移量似乎是到可执行文件的 __TEXT 段的偏移量。如何找出打印偏移量和文件顶部之间的字节增量,以便我可以编辑/修补文件中的正确字节?
感谢您提供的任何建议!
我在 source forge ( cocoa.diff )上找到了这个补丁,这意味着我可以使用 cocoa.diff 文件进行补丁。但是,我似乎无法弄清楚如何使用 .diff 文件。
谢谢你的帮助!
编辑:我试过“patch p1 < cocoa.diff”,输出是“patch: * * 在补丁输入中只发现垃圾。” 这是否意味着 .diff 文件已损坏或不正确?另外,我使用的是 Mac OSX 10.6。
如何取消修补文件和目录形成修补程序。
我使用这两个命令pd.patch在目录上应用了补丁,pf.patch在文件上应用了补丁:
patch -p1 < pd (in the directory)
patch -p1 file_unpatch < pf.patch . ( will give me file_patch(patched file_unpatch))
Run Code Online (Sandbox Code Playgroud)
我如何检索原始文件file_unpatch和unpatched目录?
编辑
我发现我们可以使用以下-R选项取消修补目录:
patch -p1 -R < pd (in the directory) --> will give me unpatched directory.
Run Code Online (Sandbox Code Playgroud)
现在,取消修补文件怎么样?
我想生成一个对象,该对象将能够有效地作为补丁应用于数组 A 以生成数组 B。
给定一个函数isSame,它比较两个值并在它们相同时返回真,否则返回假(其目的是比较两个数组元素),是否有已知的算法来计算两个数组之间的差异并返回一个列表具体区别?差异将由以下集合组成:在索引 Y 处删除的 X 元素和在索引 Y 处插入的以下元素。
我写过一些这样的作品,但目前它有问题,我无法继续前进,而且我担心当其他人可能已经这样做时我正在重新发明轮子。http://jsfiddle.net/G6tYt/1/
我正在尝试使用 Tortoise Merge 将 WinMerge 生成的补丁文件应用到新文件以获取更新的文件。我已经查看了此处的问题/答案,但收到有关所选目录不是工作目录的错误,即使我按照将桌面设置为工作目录的示例也是如此。有人可以帮忙吗?谢谢,迈克
我有一个产品(比如版本 1)并且对它做了一些自定义更改(比如版本 1.x)。我正在这些版本上运行差异并创建补丁文件。
现在有更高版本的产品(比如版本 2)。我希望将从版本 1 和版本 1.x 创建的补丁应用到版本 2 上。这里的困难在于行号不会保持不变。我知道可能也有一些失败的大块头,但如果我可以在版本 2 上应用补丁(通过忽略行号,但通过引用下面和上面的行),至少可以为我节省大量的手动工作。
最好的方法是什么?有什么建议?还有任何有用的工具可以在这里提供帮助吗?
谢谢!高拉夫
我知道将分支用于多个拉取请求,这很好。
但是这个场景呢:
我发现了两组相互矛盾的建议(但也许对 B 的依赖是不同的)
来自 GitHub 的建议似乎是说 C 应该应用于 A:
更改基本存储库会更改收到拉取请求通知的人。每个可以推送到基础存储库的人都会收到一封电子邮件通知,并在下次登录时在他们的仪表板中看到新的拉取请求。
这似乎适用于这种情况,原因有两个:
但是StackOverflow 上的这个答案恰恰相反,应该将 C 应用于 B。请注意,他的情况是a->b->c->d->e,而我的情况更简单A->B->C。
提出另一个请求。对于基础,输入 C 的提交编号,对于头部,输入 E(你的/主人)。
这相当于我的场景中的 B->C 范围。
对我来说,这两个论点都有一定的道理。哪个是正确的?
我猜答案是“这取决于......”,但我真的很感激演练。感觉这里至少有三个问题:
想法???
我需要将补丁(来自邮件列表)应用到本地 git 存储库中
邮件列表中的补丁有一个封面消息和一个简短的信息。我可以将适当的补丁文本复制粘贴到文件中并将其用作补丁。如果可能的话,有人可以提出更好的选择吗?
我正在尝试使用片段插件将补丁应用于现有插件,如下所述:
主机插件的补丁包括用更新的类文件替换单个类文件。但是我在“ 修改主机程序包清单设置步骤5)到11)中没有得到这个概念。在这里,它指示您修改主机插件。我认为整个想法是,您不必触摸主机插件-它部署的片段会添加补丁?
我的产品包括eclipse平台和org.eclipse.cdt功能,以及我自己使用cdt的插件。我要修补的是org.eclipse.cdt.core插件。
我已按照Eclipse Wiki中的步骤进行操作,并创建了我的片段项目,其中包含要在主机插件中修补的包和类。我是在Maven中构建的,当我运行该产品时,我看到我的片段插件处于活动状态,但是其中包含的类没有被调用;原始的主机插件类是。
我猜问题是修改后的主机插件不在我部署的产品中。片段指南中没有包含有关部署主机插件的建议的任何步骤,而且我不确定是否需要/为什么。
(过去,我已经成功使用了功能补丁,但只能使用PDE创建-我无法在Maven下构建功能补丁-这就是为什么我探索使用片段来查看如果我可以让他们在Maven下进行构建。)
更新*:我使用Tycho插件创建Maven的构建版本Tycho-使用maven构建Eclipse插件。
感谢您链接到“ OSGi Core Release 5规范”。那很有用。
因此,如果我的理解是正确的,那么如果主机插件已经“准备好”使用片段进行修补,则片段只能将其类覆盖在主机插件上。这涉及修改主机插件的清单。具体来说:1.添加一个新库,并将其移到“。”上方。包。从构建属性中删除该库;该库仅供参考,不应由主机插件创建。+在manifest.mf文件中添加Eclipse-ExtensibleAPI:true +增加版本号。
就我而言,如果我想使用片段修补org.eclipse.cdt.core插件,我将不得不交付org.eclipse.cdt.core插件的预备版本以及我的片段插件。
*:不确定礼节;没有足够的声誉去做很多事情。注释框仅接受少量字符。
我目前正在为Python中的sqlite3包装器编写测试覆盖.目前我的代码看起来像这样:
import unittest
from unittest.mock import patch
from MemberDatabase import MemberDatabase
@patch('sqlite3.connect')
class MemberDatabaseTestCase(unittest.TestCase):
def test_dbConnect(self, mocksql_connect):
mdb = MemberDatabase('test.db')
mocksql_connect.assert_called_with('test.db')
def test_optionalCommit(self, mocksql_connect):
mdb = MemberDatabase('test.db')
mdb.optionalCommit()
self.assertTrue(mocksql_connect().commit.called)
Run Code Online (Sandbox Code Playgroud)
其他各种测试都mdb以相同的方式创建.MemberDatabase调用的构造函数sqlite3.connect().我想通过移动的分配整理测试用例了mdb到setUp().但是,sqlite3.connect()不会被setUp()模拟,因此这会导致实际sqlite3.connect()调用并创建真正的数据库连接.
有没有办法用打补丁sqlite3.connect()的setUp()?也许我需要在内部创建模拟setUp()而不是使用装饰器,但我认为使用装饰器方法的代码更清晰.另外,我读过如果我创建模拟
patch ×10
diff ×2
git ×2
linux ×2
arrays ×1
assembly ×1
eclipse-cdt ×1
eclipse-rcp ×1
executable ×1
github ×1
javascript ×1
mailing-list ×1
maven ×1
merge ×1
mocking ×1
otool ×1
pull-request ×1
python ×1
svn ×1
tortoisesvn ×1
unit-testing ×1