技术解析

linux 编译好的软件包通用吗?
0
2021-07-05 03:17:35
idczone
最近在玩 OPENWRT ,用 hc5761 刷机刷了 openwrt 15.05 版本的系统。然后安装了挖矿软件玩玩,发现不太好用,又换了潘多拉系统(14.09 版本的),也安装了挖矿插件。突然发现我刷的两个系统内核版本不一样竟然安装了同一个 ipk 。不是听说编译好的二进制不同内核平台是不通用的吗? 百度了一下说的模糊不清, 同一个编译好的二进制,不通内核版本的 linux 应该不通用吧? 因为用 debian 的时候不同版本对应的 apt-get 源也不一样。但是同一个架构(mips)我安装了不同版本内核 kernel 的 linux ,然后安装了同一个编译好的软件是正常可以运行的。
openwrt :http://rssn.cn/roms/
潘多拉系统: http://downloads.openwrt.org.cn/PandoraBox/
挖矿插件 https://github.com/kuoruan/luci-app-youku/blob/master/releases/luci-app-youku_1.2.1-1_all.ipk
你这样看, Flyme 和 MiUI 都可以跑同一个 apk 啊。

"不通内核版本的 linux 应该不通用", 那要看是否调用了不通内核版本之间的差异化接口

1 、 ABI 相同。 2 、所有的依赖库都能做到前向兼容。
一般来说符合这两个条件即可。

openwrt 的 ipk 在编译生成的时候可以设置依赖, 依赖分为硬件依赖和软件依赖.
说人话: 只要是相同或相近 CPU 的产品, 在刷了 openwrt 之后, ipk 大多能通用. 例如大量的 MT7620n 和 MT7620a 路由器
少数 ipk 安装的时候提示不兼容, 大多是软件依赖中的内核依赖不满足, 可以手动解压缩提取出 bin 文件也能跑起来.

如果我记得没错, API, ABI, CPU 架构兼容就可以。

程序跟内核没什么关系,绝大多数程序不会去直接和内核打交道;即使有和内核通信,也已经是几十年不变的标准接口。只要程序的 CPU 架构兼容,依赖的运行库兼容就可以跑。

依赖库的版本不同,甚至命名不同都有可能导致程序不能跑……
linux 下面二进制包的发行问题已经被诟病不是一天两天了……
建议静态编译……

如果说 cpu 架构兼容 abi 依赖解决,那么为什么好多 BCM 芯片的 openwrt 不提取驱动兼容呢? 网上说 DD 和 tomato 的支持 bcm 芯片但是内核比较老。既然这样升级内核后保证依赖库不就行了吗?为什么不升级内核呢?

linux 的依赖搞死几代人了

说的比较乱整理下不知道能理解不! 既然编译好的二进制包和内核关系不大, DD 和 tomato 为什么不学 openwrt 升级内核呢?直接解决下 abi 和依赖库不就行了吗? 还有 openwrt 更新内核比较快为什不提取对应的二进制驱动打包上去呢?

抱歉我并不了解,但是我记得之前看过书是这么说的。

帖子不能编辑了。我想问下,如果我安装三个个 liunx ,同样的硬件。就内核版本不一样。 3.x 4.x 5.x 。我在 3.x 下编译了一个软件,如 unzip 。我把编译好的二进制文件放到同样硬件不同 liunx 内核(如 4.x 5.x )的电脑还可以执行吗?突然想到还没时间做测试。哪位大神知道帮忙解答下!

谢谢了!我有时间自己测试研究下把!

对嵌入式来说多数情况下升级内核并没有任何意义,而且还会有很多驱动是只能在特定版本内核使用。驱动!=程序。

帖子可以加附言

那要看你编译时候的参数是否能兼容你的 3 个 linux 。类似的情况你可以参考 java 的二进制 jre/jdk 包、 mysql 的二进制包,他们都是 linux 下的“绿色软件”,只要架构兼容既可以解压运行。

"帖子可以加附言", 加附言好贵的,还不如留言呢。
一般而言,都是可以兼容的,只要你依赖库 so 不要太特殊。我都是 cygwin 下编译成 elf, 然后直接 SSH 扔到服务器上运行,类似 unzip 这种算法,一点问题也没有。

这要看官方发行时候的说明

No ,除非作死。

是因为 app 都运行在一样的虚拟机里吧,再说他们全是安卓系统

其实这里说的很好:
https://en.wikipedia.org/wiki/Application_binary_interface
https://upload.wikimedia.org/wikipedia/commons/6/68/Linux_kernel_interfaces.svg
内核保证用户空间 API/ABI 的稳定

abi 相同,依赖库都有就可以了, abi 相同简单,依赖库就是大问题了,跟 windows 下的 DLL 一样,世界老大难问题

争取静态编译,减少依赖,

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服