预编译了一些工具的静态链接二进制,有需自取

2021-12-30 23:25:31 +08:00
 curoky

最近又有用户报缺少 thriftc/protoc 或者版本用的不一样 。。。

主要有这么几个问题:

  1. 因为共用物理机,用户不能直接 apt 安装
  2. 即便申请 root 用 apt 安装了,debian 8/9 源里面的默认版本实在是太旧了。。。
  3. 源码编译对用户来说成本太高了
  4. 直接 copy 给用户编译好的二进制,又经常因为缺少 so 或者 glic 的版本太低无法运行

不久之前编译了一些静态链接的二进制,无任何系统库依赖(包括 glibc),适用于任何 linux 发行版,最近正好拿出来给大家分享一下,本人是 clang-format/protoc/thriftc 重度用户,所以把这几个工具的每个核心版本都编译出来了,其它的工具如果大家有需求,可以提 issue 或者 pr ,有时间的话,可以一起支持了。

2843 次点击
所在节点    Linux
29 条回复
v2geek
2021-12-30 23:33:33 +08:00
为啥不用 docker ,直接用编译好的
ETiV
2021-12-30 23:35:27 +08:00
和我一样,不过我原则就是喜欢 0 依赖的(也是被 CoreOS 逼的😂)

build 过 htop 、tmux 、xtrabackup
curoky
2021-12-30 23:41:21 +08:00
@v2geek 是说开发环境吗? 部署环境是 k8s ,但是开发环境是多租户的物理机,因为安全原因( root 安装的 docker 很容易提权),没有给用户开 docker 权限,所以就很难受了... 因为用户特别多,每给用户增加一条工序,oncall 数量成指数增长🙈
wtl
2021-12-30 23:43:34 +08:00
nix 大法好
curoky
2021-12-30 23:43:59 +08:00
@ETiV 还不是因为上古时期为了节省磁盘空间嘛,搞动态库这种恶心死人的东西,现在谁缺这点磁盘空间... 🙈
Jooooooooo
2021-12-30 23:49:01 +08:00
c 为啥会这么复杂...
curoky
2021-12-30 23:49:08 +08:00
而且线上部署打包的时候都是把所有 so 都 bundle 上(包括 glibc 这种系统库),加起来产物大小是静态链接的好几倍,反而导致上线特别慢,完全颠覆了设计预期了,想想就来气...
Buges
2021-12-30 23:49:25 +08:00
@curoky 可以用 rootless mode 或开 uid 隔离,虽然有部分限制但仅仅是编译环境的话不会有什么问题。
jim9606
2021-12-30 23:52:40 +08:00
其实只有 glibc 会恶心人,因为许可证不允许这玩意静态链接非 GPL/LGPL 程序。
musl 倒是没这问题,但很多项目没法用这个。
curoky
2021-12-30 23:54:10 +08:00
@Buges 😮‍💨,给大佬们反馈过,没采纳,想来是有很多坑吧,或者懒得折腾了。
curoky
2021-12-30 23:59:54 +08:00
@jim9606 国内公司谁管这些版权啥的啊 😂,主要是 c++ 编译工具链做的一坨 X ,每次产物都 bundle 几十个 so 文件,每天能跑起来就谢天谢地了,之前遇到个动态库版本导致的 abi 问题,硬是 toubleshooting 了一个双月 💔
curoky
2021-12-31 00:05:46 +08:00
@wtl 刚看了下描述,感觉是个好东西,不过前年开始就 all in homebrew 了,同样可以做到对系统库接近 0 依赖(主要还是 glibc 不容易做掉),而且它最大的好处是同时支持 Linux/MacOS ,而且 rootless 。
curoky
2021-12-31 00:08:06 +08:00
@Jooooooooo 趁年轻,还是早点转 go/rust 比较好,c/c++ 但凡有个靠谱的 modern build system ,也不至于到现在连个靠谱的 modern build system 都没有
12101111
2021-12-31 00:11:02 +08:00
用 gentoo prefix 得了,只依赖 Linux 内核,最低支持到 CentOS6 内核,搞物理的都用这个
curoky
2021-12-31 00:22:15 +08:00
@12101111 给 homebrew 开了两年光了,实在是折腾不动了,后面有精力再研究下老哥们提到的 nix/gentoo 大法,不过说到底还是一开始没踩对坑...
Buges
2021-12-31 00:33:21 +08:00
@jim9606 错了,glibc 不是许可证的问题,而是本身设计的就不是为了静态链接工作的。glibc 在运行时会通过 dlopen 获取自身的 handler ,如果静态链接 glibc 就会取得主程序 /系统中的另一个版本的 glibc 的 handler ,会产生什么结果那就谁也不知道了。另外 glibc 的 abi 稳定程度是完全可以作为系统接口使用,基本上不是太旧都没问题,或许不如 win32 的兼容性但至少不会差于 macos 。具体可以看看 linuxbrew 能够支持到的 glibc 版本。
@curoky rootless docker 不需要开权限,普通用户就能安装,当然要满足一些条件(内核允许 user_ns/专门的 overlayfs 驱动)。听说 podman 对 rootless 的支持更好一些。
thedrwu
2021-12-31 01:35:19 +08:00
tmux 开个对应系统的 docker 编译起新版本来还算快,但是忍了服务器上的 clangd/formatter 好久了,自己又懒得编译。

vim 这类有许多零散文件的估计只能自己编译到 home 目录。
hsfzxjy
2021-12-31 01:43:48 +08:00
Nitroethane
2021-12-31 01:59:57 +08:00
@curoky 共享库可不只是为了节省磁盘空间。

1. 假设某个项目用到的第三方库被爆出很严重的漏洞,此第三方库修复之后发布了补丁版本。动态链接情况:只需要更新共享库。静态链接情况:下载补丁版本,重新编译并发布自己的项目。
2. 节省内存。例如每个程序都用到的 libc 库,动态链接情况下只需要在内存中加载一份 libc 共享库。
lingxi27
2021-12-31 02:10:42 +08:00
@curoky 动态链接可不仅仅是节约空间那么简单,debug 静态链接的顺序问题也是很恶心的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825390

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX