记录一下给某应用打补丁遇到的几个问题

某应用突然发布了一个紧急补丁,要求必须、尽快给应用打补丁,否则会有一些危险。

image.png
(图源 :pixabay)

看了一下补丁以两种形式提供:源代码以及二进制。

因为我一项都是使用源代码自行编译应用,所以首先想到的还是使用源码编译。这就遇到了第一个问题,如何给源码应用补丁。

给源码打补丁

看了一眼源码的补丁后缀为.diff,并且看了一下文件的文本内容,不难判断补丁是由git diff生成。

那么给源码打补丁其实很简单

  • 使用git clone下载指定版本的源代码。
  • 使用scp将对应版本的补丁文件上传至对应目录。
  • 使用git apply --check xxx.diff检查补丁
  • 使用git apply xxx.diff应用补丁(亦即打补丁)

然后按着正常的流程编译代码即可。

make Error 137

以前编译源码都一且顺利,这次编译着编译着,竟然把VPS干死机了,从来没有遇到过的事情。

无奈之下,只能登录到VPS后台控制面板,远程启动启动,然后从新编译并关注输出。然后总算让我发现大量的Error 137信息。

Google查询了一下,make 出现Error 137错误信息,是由于内存不足。

A 137 code is issued when a process is terminated externally because of its memory consumption. The operating system's out of memory manager (OOM) intervenes to stop the program before it destabilizes the host.

可是我的VPS可是有着32G内存的高配主机呀(但是只有4个CPU内核),我试着在编译时指定只使用2个线程,这次倒是没死机。但是出了一堆其它错误后编译失败。

我怀疑错误和这句提示有关:

warning "Versions of libc++ prior to the one shipped with Clang 3.5.0 are not supported by Hana."

但是因为每次编译都需要很长时间,我懒得去找问题所在,决定直接应用二进制补丁啦。

解包.dep文件

官方提供的二进制补丁是一堆不同应用版本&系统版本的.dep后缀文件,所以首先我要选择我要使用的应用版本并且系统版本。

选择好了之后,用scp将文件上传至VPS对应目录。

然后问题来了,一般的操作都是直接将对应的dep文件安装到系统中去,也就是使用如下指令:

sudo dpkg -i xxx.deb

或者

sudo apt install xxx.deb

但是因为之前我都是从源码编译安装的,而且是以用户形式(而不是root)来运行应用的,所以显然这种安装方式并不适合我。

所以我决定将.dep包解包,并从中提取编译好的应用文件,然后替代我的文件。

解包指令为:

mkdir hotfix
dpkg -X xxx.dep hotfix

然后去hotfix目录以及其下的目录中查找就可以找到对应的二进制文件,直接将其复制并覆盖我的文件,一且搞定!

总结

这次被逼无奈使用二进制补丁,突然发现我每次都从源码编译又傻又笨又浪费时间,但是觉得还是自己编译放心一些。

image.png
(图源 :pixabay)

当我做完这一切之后,应用又发布了新版本,也就是说,可以直接使用新版本而无需打补丁了,哎,白折腾了,好想喝杯咖啡压压惊,又怕晚上失眠,哎。

Sort:  

这是O哥职业的强迫性 哈哈

哈哈,瑞幸咖啡表示点咖啡就选瑞幸,便宜好喝还顺丰送上门.

啊,那够运费的不?哈哈哈

两杯以上就可以包邮了哦😄

大佬一般都是不走寻常路,不折腾下,怎么知道自己牛不牛?技术有没有精进?😂

@tipu curate

好专业 就是一句没看懂😖

谢谢点太太

!LOL

Why doesn’t Dracula have any friends?
Well……I hear he is a pain in the neck.

Credit: reddit
@oflyhigh, I sent you an $LOLZ on behalf of gameexp

(4/6)

PLAY & EARN $DOOM

看不懂😭

把安装包拆了然后直接复制粘贴盖下去的这套操作,我也要学起来,可能偶尔有用……官方没给已编译好但是打包成.tar.gz格式的吗?😂