Cosmopolitan Libc 工作原理与多平台使用(x64 Linux / WSL2 / Windows)

cosmopolitan logo


⚠️阅读前请注意

  • 本博客适用于Cosmopolitan Libc 3.X版本,不适用于Cosmopolitan Libc 2.X版本。
  • Cosmopolitan Libc 是一个非常年轻的项目,可能存在各种问题。
  • Cosmopolitan Libc 仍处于快速迭代开发之中,本文内容在一定时期内会持续更新。

Cosmopolitan Libc 工作原理 与 多平台使用

Cosmopolitan Libc 简介

Cosmopolitan Libc makes C a build-anywhere run-anywhere language, like Java, except it doesn’t need an interpreter or virtual machine. Instead, it reconfigures stock GCC and Clang to output a POSIX-approved polyglot format that runs natively on Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS on AMD64 and ARM64 with the best possible performance.


带有补充信息的翻译:
Cosmopolitan Libc 让 C 语言成为了“到处构建,到处运行”的语言。就像 Java 语言那样,但无需使用解释器或虚拟机。Cosmopolitan Libc 配套的编译工具链重新配置了现有的 GCC 和 Clang,以构建得到符合 POSIX 标准的多语言格式的二进制文件——该格式的二进制文件可以在 AMD64 和 ARM64 架构上的 Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS 多种平台上原生运行,并具有尽可能高的性能。

  • Cosmopolitan Libc 项目主页:https://justine.lol/cosmopolitan/index.html
  • Cosmopolitan Libc 代码仓库:https://github.com/jart/cosmopolitan

Cosmopolitan Libc 是由Justine Tunney主导开发的一款跨架构跨平台的C标准库。配合Cosmopolitan 编译工具链,编译出的二进制文件可以在不同架构的不同系统平台上原生运行。

Cosmopolitan Libc 3.3.3 的平台支持表

PlatformMin VersionCirca
AMDK8 Venus2005
IntelCore2006
Linux2.6.182007
Windows82012
Darwin (macOS)23.1.0+2023
OpenBSD72021
FreeBSD132020
NetBSD9.22021

跨平台运行原理

一般而言,Windows平台原生支持的可执行文件与库文件(统称为二进制文件)为PE格式(Portable Executable 可移植的可执行文件)。
Unix平台原生支持的二进制文件为ELF格式(Executable and Linkable Format 可执行并可链接的文件格式)。

为了顾及上述两个平台的兼容性,Cosmopolitan工具链编译出的二进制文件为APE格式(Actually Portable Executable 确实可移植的可执行文件)。Justine Tunney之所以取这个名字,可能是为了调侃Windows二进制文件的PE格式(Portable Executable 可移植的可执行文件)不够“可移植”。

APE格式的绝妙之处在于

  • APE是一种完全合法的Windows PE格式。只不过APE利用了PE格式文件开头的DOS Header段、DOS Stub段与空白空间来存放Shell脚本,并利用PE结尾的空白空间来存放ELF文件内容。
    因此在Windows平台下,APE格式的文件会被当作正常的PE格式文件执行。读者可以通过PE-bear(Windows)或readpe(Linux)工具查看它的具体结构。
  • APE是一段可以执行的Unix Shell脚本。根据Unix Shell的特性,若在Unix平台直接执行APE格式的文件,文件会被默认当做Shell脚本执行。此时位于APE开头的Shell脚本,将会发挥它的作用。
    该脚本会自动将APE Loader解压到本地,接着APE Loader会读取APE中存储的ELF文件头与段信息。最终通过mmap()操作,把藏在APE文件里的ELF信息加载到内存之中。
    这一步“加载到内存”的操作,与普通的ELF文件被加载到内存的过程一致。随后程序被Unix系统内核调度运行,就像那些从普通ELF文件被加载到内存的程序一样。
    Unix平台下,可以通过Shell的调试手段来观察APE文件的执行原理sh -x APE格式的可执行文件

在 x64 Linux / WSL2 平台使用 Cosmopolitan Libc

参考测试环境

  • Ubuntu 22.04.3 LTS

获取Cosmopolitan工具链

若想直接体验Cosmopolitan Libc的功能,可以按照其官网主页的指示,直接获取编译好的Cosmopolitan编译工具链。按如下命令执行,工具链将被放置在./cosmocc/目录,下列命令执行后,当前工作路径即为该目录。

mkdir cosmocc
cd cosmocc
wget https://cosmo.zip/pub/cosmocc/cosmocc.zip
unzip cosmocc.zip

和GCC编译工具链类似,Cosmopolitan编译工具链主要包含

  • C编译器 bin/cosmocc
    工具链的C编译器。为提供跨架构跨平台支持,该文件实际上是一个Shell脚本。在构建目标时,其会调用bin/目录下具体针对不同架构、不同平台的C编译工具。编译工具均为APE格式。
  • C标准库 x86_64-linux-cosmo/lib/libcosmo.aaarch64-linux-cosmo/lib/libcosmo.a
    工具链中,针对不同架构的静态C标准库。Cosmopolitan Libc本体。静态库中被归档的二进制对象文件均为ELF格式。
  • C++编译器 bin/cosmoc++
    工具链的C++编译器。为提供跨架构跨平台支持,该文件实际上是一个Shell脚本。在构建目标时,其会调用bin/目录下具体针对不同架构、不同平台的C++编译工具。编译工具均为APE格式。
  • C++标准库 x86_64-linux-cosmo/lib/libcxx.aaarch64-linux-cosmo/lib/libcxx.a
    工具链中,针对不同架构的,基于Cosmopolitan Libc与LLVM项目的静态C++标准库。静态库中被归档的二进制对象文件均为ELF格式。
  • C/C++头文件目录 include/
    工具链的C/C++头文件存放与搜寻目录。
  • 其它构建工具
    工具链所需要的构建工具,如bin/makebin/ctags等。构建工具均为APE格式。

测试运行APE文件

执行以下命令,测试您的系统能否运行APE格式的可执行文件。以工具链中的bin/make工具为例

bin/make --version

参考输出

GNU Make 4.4.1
Built for x86_64-linux-cosmo
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Zsh 与 Fish 使用者
如果出现zsh: exec format error,则需要升级到 zsh 5.9 以上版本。Fish 也是如此。
若要临时解决该问题,根据APE文件的运行原理,我们可以显式地把APE文件当作Shell脚本运行

sh bin/make

WSL2 使用者
如果出现error: APE is running on WIN32 inside WSL. You need to run: sudo sh -c 'echo -1 > /proc/sys/fs/binfmt_misc/WSLInterop',代表WSL2启用了WSLInterop支持。
若WSL2启用了该支持,当WSL2检测到可执行文件属于Windows原生程序(如PE文件)时,会以WIN32方式执行该文件,因此会报错。请参见安装 APE Loader 并配置 binfmt_misc一节。
若要临时解决该问题,根据APE文件的运行原理,我们可以显式地把APE文件当作Shell脚本运行

sh bin/make

【可选】安装 APE Loader 并配置 binfmt_misc

WSL2 使用者
若WSL2启用了WSLInterop支持(应当默认启用),当WSL2检测到可执行文件属于Windows原生程序(如PE文件)时,会以WIN32方式执行该文件。
为了在不影响WSLInterop功能的情况下运行APE文件,请WSL2使用者务必执行该步骤

Wine 使用者
如果Linux中安装了Wine,且Linux会自动通过Wine运行PE可执行文件,则必须要执行该步骤
执行该步骤后,APE文件会被绑定到APE Loader。以后运行APE文件时,系统会直接将该文件交给APE Loader运行。

根据跨平台运行原理所述,在Unix平台上运行APE文件时,该文件会被当作Shell脚本执行,并且自动运行APE Loader。在此过程中,APE文件会作为入参被传递给APE Loader,由其提取并加载文件中的ELF信息到内存。

若Unix平台未安装APE Loader(即ape命令不存在),则Shell脚本会自动将APE Loader解压到本地。解压位置规则如文档所描述,典型位置是$HOME/.ape*$TMPDIR/.ape*./.ape*

如果Unix平台已经安装APE Loader,ape命令已存在,则APE文件会直接调用ape命令。我们可以执行下列命令,把APE Loader安装到Linux系统的/usr/bin/ape位置

sudo wget -O /usr/bin/ape https://cosmo.zip/pub/cosmos/bin/ape-$(uname -m).elf
sudo chmod +x /usr/bin/ape

binfmt_misc是Linux内核提供的一个功能特性——用户可以指定使用某个程序去运行某类文件。效果上有点类似于Unix的Shebang或者Windows的“文件默认打开方式”。

执行以下命令,可以临时指定使用/usr/bin/ape程序来运行APE格式文件(靠文件头的magic number识别),重启后失效

sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"
sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register"

当我们再次从Shell中运行bin/make文件时,系统将自动运行/usr/bin/ape bin/make命令。不再需要依靠APE文件头部的Shell脚本去运行APE Loader。

对于使用了systemd-binfmt.service服务的Linux发行版,可以在/etc/binfmt.d/目录下创建相应的注册项,然后重启systemd-binfmt.service服务,即可永久生效

sudo sh -c "echo ':APE:M::MZqFpD::/usr/bin/ape:' >/etc/binfmt.d/ape.conf"
sudo sh -c "echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/etc/binfmt.d/ape-jart.conf"

重启systemd-binfmt.service服务

# 对于WSL2,systemd-binfmt.service服务可能默认被mask掉,请先将其unmask,然后再restart
# sudo systemctl unmask systemd-binfmt.service

sudo systemctl restart systemd-binfmt.service

编译运行 Hello World

确认APE文件可以正常运行后,创建一个简单的测试用的C文件hello.c

#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("hello world\n");
}

和GCC编译工具链的使用方式一致,使用bin/cosmoccC语言编译器来编译hello.c,得到APE格式的./hello可执行文件

bin/cosmocc -o hello hello.c

跨平台运行

得到APE格式的./hello可执行文件后,首先尝试在本平台运行

./hello

windows hello

将其复制到Windows系统下。更改其文件名为hello.exe,增加Windows可执行文件的后缀.exe。尝试在PowerShell或者CMD中运行

.\hello.exe

windows hello

在Windows平台运行APE文件时,可能会触发Windows Defender的报警。请仔细阅读如下Issue。若信任Cosmopolitan项目,请将APE文件列入Windows Defender白名单,再尝试运行。

https://github.com/search?q=repo%3Ajart%2Fcosmopolitan+windows+defender&type=issues

参考文档

Shell脚本的执行机制

https://stackoverflow.com/questions/12296308/shell-script-working-fine-without-shebang-line-why

Executable and Linkable Format

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

ELF format

Portable Executable

https://en.wikipedia.org/wiki/Portable_Executable
https://0xrick.github.io/win-internals/pe2/

PE format

Actually Portable Executable

https://justine.lol/ape.html
https://justine.lol/apeloader/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/533433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序项目思路分享爬虫

小程序项目思路分享爬虫 具体需求&#xff1a; 有这几个就行&#xff0c;门店名称门店地址门店类型&#xff0c;再加上省、市、县/区门店名称&#xff1a;storeName 门店地址&#xff1a;storeAddress 程序运行&#xff1a; honor_spider获取经纬度信息。 经纬度——>详…

selenium添加代理(有账号密码)

以下为各种尝试的记录&#xff0c;正确实现可直接参考最后一条&#xff01; 1&#xff0c;导入Proxy库来添加capabilities属性&#xff1a;可以访问网站&#xff0c;但ip还是本机ip from selenium import webdriver from selenium.webdriver.chrome.options import Options f…

雪亮工程视频汇聚EasyCVR视频建设方案:当前现状与痛点分析

一、现状分析与痛点 经过近几年的努力&#xff0c;平安城市雪亮工程建设取得了显著的成绩&#xff0c;完成了前端高清视频点位和高清卡口系统建设&#xff0c;建成了视频监控类、卡口类和应用类的平台。这些系统的建设在提高城市公共事业和社会治安动态管理方面发挥了积极作用…

uniapp 上传视频到阿里云之后回显视频获取视频封面

uniapp 上传视频到阿里云之后回显视频获取视频封面 官网的解决方案 1.initial-time Number 指定视频初始播放位置&#xff0c;单位为秒&#xff08;s&#xff09;。 没什么卵用 2.使用 uni.createVideoContext(“myVideo”, this).seek(number)。 没什么卵用 <video :id&quo…

Python | Leetcode Python题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:dummy ListNode(0, head)first headsecond dummyfor i in range(n):first first.nextwhile first:first first.nextsecond second.nextsecond.ne…

C语言 函数——断言与防御式编程

目录 如何确定假设的真假&#xff1f; 断言 防御式编程&#xff08;Defensive programming&#xff09; 如何确定假设的真假&#xff1f; 程序中的假设 *某个特定点的某个表达式的值一定为真 *某个特定点的某个表达式的值一定位于某个区间等 问题&#xff1a;如何确定这些…

test4111

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

ExoPlayer停止更新,建议升级到AndroidX Media3

1. 大家常用的ExoPlayer地址&#xff1a;GitHub - google/ExoPlayer: An extensible media player for Android ExoPlayer是谷歌官方提供的媒体播放库&#xff0c;大家在开发项目中经常使用ExoPlayer播放音视频&#xff0c;谷歌官方已经明确表示该库在2024-04-03停止更新&…

Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程

目录 安装 基础依赖 安装 docker 开机自启 启动 docker 配置国内镜像源 使用教程 帮助命令 镜像命令 容器命令 容器终端 构建镜像 安装 基础依赖 如果直接安装 docker 时报错&#xff0c;提示缺少依赖&#xff0c;则根据提示将前置依赖安装即可&#xff0c;这里直…

Savitzky-Golay滤波器基本原理

本文介绍Savitzky-Golay滤波器基本原理。 Savitzky-Golay滤波器&#xff08;简称为S-G滤波器&#xff09;被广泛地运用于数据平滑去噪&#xff0c;它是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器最大的特点在于在滤除噪声的同时确保信号的形状&#xff…

MT3020 任务分配

思路&#xff1a;利用二分找到某个时间是满足“k个人可以完成” &#xff0c;并且时间最小。 因为尽量让后面的人做任务&#xff0c;所以从后往前排任务&#xff08;倒着分配&#xff09;。从后往前遍历任务&#xff0c;如果此人加上这个任务超出之前求得的时间&#xff0c;就…

Qt5中使用QPrinter和QprintDialog类

学习Qt过程中&#xff0c;做一个简单的编辑器&#xff0c;其中需要使用到打印文本功能&#xff0c;在使用Qt printer时遇到了几个麻烦。 一、在使用到QPrinter和QprintDialog类时的附加处理 ①若是在qt creator中&#xff0c;需要在 &#xff08;.pro&#xff09;工程文件中加…

inner join和left semi join的联系和区别

参考&#xff1a;添加链接描述 添加链接描述 1 简介 LEFT SEMI JOIN &#xff08;左半连接&#xff09;是 IN/EXISTS 子查询的一种更高效的实现。 示例 可以改写为 2 特点 1、left semi join 的限制是&#xff0c; JOIN 子句中右边的表只能在 ON 子句中设置过滤条件&…

Python学习从0开始——项目一day01爬虫

Python学习从0开始——项目一day01爬虫 一、导入代码二、使用的核心库三、功能测试3.1初始代码3.2新建文件3.3代码调试 四、页面元素解析4.1网页4.2修改代码4.3子页面4.4修改代码 一、导入代码 在Inscode新建一个python类型的项目&#xff0c;然后打开终端&#xff0c;粘贴以下…

[通俗易懂]《动手学强化学习》学习笔记2-第2、3、4章

文章目录 前言小总结&#xff08;前文回顾&#xff09;第二章 多臂老虎机2.2.2形式化描述 第三章 马尔可夫决策过程3.6 占用度量 代码3.6 占用度量 定理2 第四章 动态规划算法4.3.3 策略迭代算法 代码 总结 前言 参考&#xff1a; 《动手学强化学习》作者&#xff1a;张伟楠&a…

使用 Docker 部署 Open-Resume 在线简历平台

1&#xff09;Open-Resume 介绍 GitHub&#xff1a; https://github.com/xitanggg/open-resume Open-Resume 是一款功能强大的开源 简历生成器 和 简历解析器 。可以帮助我们快速的生成个人简历&#xff0c;并定制化不同的主题和布局风格。该项目的目标是为每个人提供免费的现…

Harmony鸿蒙南向驱动开发-UART

UART指异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;是通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输。 两个UART设备的连接示意图如下&#xff0c;UART与其他模块一般用2线&a…

算法打卡day42|动态规划篇10| Leetcode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

算法题 Leetcode 121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 大佬视频讲解&#xff1a;121. 买卖股票的最佳时机视频讲解 个人思路 这道题之前贪心算法做过&#xff0c;当然动规也能解决这道题 解法 贪心法 取最左最小值&#xff0c;取最右最大值&#x…

CSS设置首字母大小写和首行样式

一、首字母大小写 1.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title&…

顺序表(增删减改)+通讯录项目(数据结构)

什么是顺序表 顺序表和数组的区别 顺序表本质就是数组 结构体初阶进阶 系统化的学习-CSDN博客 简单解释一下&#xff0c;就像大家去吃饭&#xff0c;然后左边是苍蝇馆子&#xff0c;右边是修饰过的苍蝇馆子&#xff0c;但是那个好看的苍蝇馆子一看&#xff0c;这不行啊&a…