自制编译器c酱

zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ cat eq.cb
import stdio;

int
main(int argc, char **argv)
{
    char *s = "OK";
    char *t = "??";

    printf("%d;%d;%d", (5 == 3), (5 == 5), (3 == 5));
    printf(";%d;%d;%d", (s == t), (s == s), (t == s));
    puts("");
    return 0;
}

zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ cbc eq.cb
zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ ./eq
0;1;0;0;1;0

zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ cat ~/.bashrc

 

export PATH=/usr/local/cbc/bin/:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cbc/lib/
alias cbc="cbc -Wa,--32 -Wl,-melf_i386"

 

 

zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ file eq.o

输出:
addressof: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, not stripped

这是一个典型的32位ELF可执行文件的文件头信息描述,包含以下关键特征:

    ‌文件类型‌:
        ELF 32-bit LSB executable:32位小端字节序的可执行文件13
        Intel 80386架构:针对x86处理器架构编译24

    ‌链接特性‌:
        dynamically linked:动态链接方式,依赖外部共享库27
        指定动态链接器路径:/lib/ld-linux.so.228

    ‌调试信息‌:
        not stripped:保留符号表和调试信息24

    ‌系统兼容性‌:
        for GNU/Linux 3.2.0:目标系统内核版本要求


这种格式的文件通常可以通过以下工具分析:

    readelf 查看ELF结构
    objdump 反汇编
    ldd 检查动态库依赖
    file 命令识别文件类型


==========================================================
zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ readelf -a eq.o
ELF 头:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  类别:                              ELF32
  数据:                              2 补码,小端序 (little endian)
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI 版本:                          0
  类型:                              REL (可重定位文件)
  系统架构:                          Intel 80386
  版本:                              0x1
  入口点地址:               0x0
  程序头起点:          0 (bytes into file)
  Start of section headers:          532 (bytes into file)
  标志:             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           0 (bytes)
  Number of program headers:         0
  Size of section headers:           40 (bytes)
  Number of section headers:         9
  Section header string table index: 8

节头:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00000000 000034 0000a5 00  AX  0   0  1
  [ 2] .rel.text         REL             00000000 00019c 000040 08   I  6   1  4
  [ 3] .data             PROGBITS        00000000 0000d9 000000 00  WA  0   0  1
  [ 4] .bss              NOBITS          00000000 0000d9 000000 00  WA  0   0  1
  [ 5] .rodata           PROGBITS        00000000 0000d9 00001a 00   A  0   0  1
  [ 6] .symtab           SYMTAB          00000000 0000f4 000090 10      7   6  4
  [ 7] .strtab           STRTAB          00000000 000184 000018 00      0   0  1
  [ 8] .shstrtab         STRTAB          00000000 0001dc 000038 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  p (processor specific)

There are no section groups in this file.

本文件中没有程序头。

There is no dynamic section in this file.

重定位节 '.rel.text' at offset 0x19c contains 8 entries:
 偏移量     信息    类型              符号值      符号名称
00000007  00000501 R_386_32          00000000   .rodata
0000000f  00000501 R_386_32          00000000   .rodata
00000044  00000501 R_386_32          00000000   .rodata
0000004a  00000702 R_386_PC32        00000000   printf
0000007f  00000501 R_386_32          00000000   .rodata
00000085  00000702 R_386_PC32        00000000   printf
0000008d  00000501 R_386_32          00000000   .rodata
00000093  00000802 R_386_PC32        00000000   puts

The decoding of unwind sections for machine type Intel 80386 is not currently supported.

Symbol table '.symtab' contains 9 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS eq.cb
     2: 00000000     0 SECTION LOCAL  DEFAULT    1
     3: 00000000     0 SECTION LOCAL  DEFAULT    3
     4: 00000000     0 SECTION LOCAL  DEFAULT    4
     5: 00000000     0 SECTION LOCAL  DEFAULT    5
     6: 00000000   165 FUNC    GLOBAL DEFAULT    1 main
     7: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND printf
     8: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND puts

No version information found in this file.
=======================================================================================
zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ ldd --version
ldd (Ubuntu GLIBC 2.31-0ubuntu9.18) 2.31
Copyright (C) 2020 自由软件基金会。
这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性
或者适合某些特殊目的。
由 Roland McGrath 和 Ulrich Drepper 编写。
zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ ldd -v eq.o
    不是动态可执行文件
zzq@zzq:~/下载/自制编译器cb/cbc-1.0/test$ ldd -v /lib/ld-linux.so.2
    statically linked


=======================================================================================
objdump -s eq.o

eq.o:     文件格式 elf32-i386

Contents of section .text:
 0000 5589e583 ec08b800 00000089 45fcb803  U...........E...
 0010 00000089 45f8b803 00000083 f8050f94  ....E...........
 0020 c00fb6c0 50b80500 000083f8 050f94c0  ....P...........
 0030 0fb6c050 b8050000 0083f803 0f94c00f  ...P............
 0040 b6c050b8 06000000 50e8fcff ffff83c4  ..P.....P.......
 0050 108b45f8 8b4dfc39 c80f94c0 0fb6c050  ..E..M.9.......P
 0060 8b45fc8b 4dfc39c8 0f94c00f b6c0508b  .E..M.9.......P.
 0070 45fc8b4d f839c80f 94c00fb6 c050b80f  E..M.9.......P..
 0080 00000050 e8fcffff ff83c410 b8190000  ...P............
 0090 0050e8fc ffffff83 c404b800 000000eb  .P..............
 00a0 0089ec5d c3                          ...].           
Contents of section .rodata:
 0000 4f4b003f 3f002564 3b25643b 2564003b  OK.??.%d;%d;%d.;
 0010 25643b25 643b2564 0000               %d;%d;%d..
 
 
 
 这是一个32位ELF格式的目标文件(obj)的反汇编内容输出,包含.text代码段和.rodata只读数据段的信息

    ‌.text段分析‌:
        包含机器码指令(左侧十六进制)和对应的ASCII表示(右侧)
        起始指令序列5589e5对应push ebp; mov ebp, esp(函数序言)1
        可见多个e8fcffffff调用指令(相对地址调用)和83c4栈调整指令16
        末尾89ec5d c3对应mov esp, ebp; pop ebp; ret(函数尾声)1

    ‌.rodata段分析‌:
        包含字符串常量"OK"(4f4b)、"??"(3f3f)和格式化字符串"%d;%d;%d"2
        十六进制值00表示字符串终止符2

    ‌关键特征‌:
        使用32位x86指令集(elf32-i386)
        包含函数调用和栈操作(典型C编译结果)
        未链接状态(调用地址仍为fcffffff占位符)

建议进一步分析:
这是一个32位ELF格式的目标文件(obj)的反汇编内容输出,包含.text代码段和.rodata只读数据段的信息。

.text段分析‌:

包含机器码指令(左侧十六进制)和对应的ASCII表示(右侧)
起始指令序列5589e5对应push ebp; mov ebp, esp(函数序言)
可见多个e8fcffffff调用指令(相对地址调用)和83c4栈调整指令
末尾89ec5d c3对应mov esp, ebp; pop ebp; ret(函数尾声)

.rodata段分析‌:

包含字符串常量"OK"(4f4b)、"??"(3f3f)和格式化字符串"%d;%d;%d"
十六进制值00表示字符串终止符

关键特征‌:

使用32位x86指令集(elf32-i386)
包含函数调用和栈操作(典型C编译结果)
未链接状态(调用地址仍为fcffffff占位符)

建议进一步分析:

bash
objdump -d eq.o  # 反汇编代码段
objdump -t eq.o  # 查看符号表
readelf -a eq.o  # 完整ELF结构分析




============================================================
ELF 是 ‌Executable and Linkable Format‌(可执行与可链接格式)的缩写,它是类 Unix 系统(如 Linux、FreeBSD)中用于存储二进制文件的标准格式,主要包含以下四类文件:

    ‌可执行文件‌(Executable File)
        可直接运行的程序(如 Linux 下的 /bin/ls)15。
    ‌可重定位文件‌(Relocatable File)
        编译后的中间目标文件(.o 文件),需链接生成可执行文件或共享库1218。
    ‌共享目标文件‌(Shared Object File)
        动态链接库(.so 文件),供程序运行时加载712。
    ‌核心转储文件‌(Core Dump File)
        程序崩溃时生成的内存状态快照

===============================================================

https://github.com/leungwensen/cbc-ubuntu-64bit

https://www.ituring.com.cn/book/1308

https://blog.csdn.net/qq_43566431/article/details/129582802

https://blog.csdn.net/denglin12315/article/details/122425137

lib32ncurses5 

将apt-get install lib32ncurses5改为apt-get install lib32ncurses5-dev

 

 

cbc 安装备注:

1)自制编译器   日本人用java写的cb编译器
https://www.ituring.com.cn/book/1308

2)cbc-ubuntu-64bit
https://github.com/leungwensen/cbc-ubuntu-64bit


3)搭建cbc环境——再Ubuntu-64上安装cbc环境
https://blog.csdn.net/denglin12315/article/details/122425137

按照3)里面方法在ubuntu20.4LTS 64位 上安装cbc ,发现不需要安装 lib32ncurses5

zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install -y lib32ncurses5
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
E: 无法定位软件包 lib32ncurses5



4)Cb-Compiler的安装和使用
https://blog.csdn.net/qq_43566431/article/details/129582802


========整个安装过程记录================================================

zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc -Wa,"--32" -Wl,"-melf_i386" hello.cb
/usr/bin/ld: 找不到 /usr/lib32/crt1.o: 没有那个文件或目录
/usr/bin/ld: 找不到 /usr/lib32/crti.o: 没有那个文件或目录
/usr/bin/ld: 当搜索用于 /usr/lib/x86_64-linux-gnu/libc.so 时跳过不兼容的 -lc
/usr/bin/ld: 当搜索用于 /usr/lib/x86_64-linux-gnu/libc.a 时跳过不兼容的 -lc
/usr/bin/ld: 找不到 -lc
/usr/bin/ld: 找不到 /usr/lib32/crtn.o: 没有那个文件或目录
cbc: error: /usr/bin/ld failed. (status 1)
cbc: error: compile error
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get update
获取:1 http://security.ubuntu.com/ubuntu focal-security InRelease [128 kB]
命中:2 http://ppa.launchpad.net/linuxgndu/sqlitebrowser/ubuntu focal InRelease
命中:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease                              
命中:4 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates InRelease                     
命中:5 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-backports InRelease
获取:6 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [74.7 kB]
获取:7 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 DEP-11 Metadata [212 B]
获取:8 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [160 kB]
获取:9 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 DEP-11 Metadata [940 B]
已下载 363 kB,耗时 3秒 (112 kB/s)
正在读取软件包列表... 完成
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install -y \
> gcc-multilib
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
将会同时安装下列软件:
  gcc-9-multilib lib32asan5 lib32atomic1 lib32gcc-9-dev lib32gcc-s1 lib32gomp1 lib32itm1
  lib32quadmath0 lib32stdc++6 lib32ubsan1 libc6-dev-i386 libc6-dev-x32 libc6-i386 libc6-x32
  libx32asan5 libx32atomic1 libx32gcc-9-dev libx32gcc-s1 libx32gomp1 libx32itm1
  libx32quadmath0 libx32stdc++6 libx32ubsan1
下列【新】软件包将被安装:
  gcc-9-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-9-dev lib32gcc-s1 lib32gomp1
  lib32itm1 lib32quadmath0 lib32stdc++6 lib32ubsan1 libc6-dev-i386 libc6-dev-x32 libc6-i386
  libc6-x32 libx32asan5 libx32atomic1 libx32gcc-9-dev libx32gcc-s1 libx32gomp1 libx32itm1
  libx32quadmath0 libx32stdc++6 libx32ubsan1
升级了 0 个软件包,新安装了 24 个软件包,要卸载 0 个软件包,有 3 个软件包未被升级。
需要下载 22.1 MB 的归档。
解压缩后会消耗 105 MB 的额外空间。
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libc6-i386 amd64 2.31-0ubuntu9.18 [2,729 kB]
获取:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libc6-dev-i386 amd64 2.31-0ubuntu9.18 [1,903 kB]
获取:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libc6-x32 amd64 2.31-0ubuntu9.18 [2,781 kB]
获取:4 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libc6-dev-x32 amd64 2.31-0ubuntu9.18 [1,977 kB]
获取:5 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32gcc-s1 amd64 10.5.0-1ubuntu1~20.04 [49.1 kB]
获取:6 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32gcc-s1 amd64 10.5.0-1ubuntu1~20.04 [41.6 kB]
获取:7 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32gomp1 amd64 10.5.0-1ubuntu1~20.04 [108 kB]
获取:8 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32gomp1 amd64 10.5.0-1ubuntu1~20.04 [102 kB]
获取:9 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32itm1 amd64 10.5.0-1ubuntu1~20.04 [28.1 kB]
获取:10 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32itm1 amd64 10.5.0-1ubuntu1~20.04 [26.5 kB]
获取:11 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32atomic1 amd64 10.5.0-1ubuntu1~20.04 [8,764 B]
获取:12 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32atomic1 amd64 10.5.0-1ubuntu1~20.04 [9,272 B]
获取:13 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32asan5 amd64 9.4.0-1ubuntu1~20.04.2 [2,647 kB]
获取:14 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32asan5 amd64 9.4.0-1ubuntu1~20.04.2 [2,584 kB]
获取:15 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32stdc++6 amd64 10.5.0-1ubuntu1~20.04 [522 kB]
获取:16 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32ubsan1 amd64 10.5.0-1ubuntu1~20.04 [756 kB]
获取:17 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32stdc++6 amd64 10.5.0-1ubuntu1~20.04 [486 kB]
获取:18 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32ubsan1 amd64 10.5.0-1ubuntu1~20.04 [763 kB]
获取:19 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32quadmath0 amd64 10.5.0-1ubuntu1~20.04 [230 kB]
获取:20 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32quadmath0 amd64 10.5.0-1ubuntu1~20.04 [149 kB]
获取:21 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32gcc-9-dev amd64 9.4.0-1ubuntu1~20.04.2 [2,224 kB]
获取:22 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32gcc-9-dev amd64 9.4.0-1ubuntu1~20.04.2 [2,010 kB]
获取:23 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 gcc-9-multilib amd64 9.4.0-1ubuntu1~20.04.2 [1,068 B]
获取:24 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal/main amd64 gcc-multilib amd64 4:9.3.0-1ubuntu2 [1,516 B]
已下载 22.1 MB,耗时 9秒 (2,510 kB/s)                                                          
正在选中未选择的软件包 libc6-i386。
(正在读取数据库 ... 系统当前共安装有 264849 个文件和目录。)
准备解压 .../00-libc6-i386_2.31-0ubuntu9.18_amd64.deb  ...
正在解压 libc6-i386 (2.31-0ubuntu9.18) ...
正在选中未选择的软件包 libc6-dev-i386。
准备解压 .../01-libc6-dev-i386_2.31-0ubuntu9.18_amd64.deb  ...
正在解压 libc6-dev-i386 (2.31-0ubuntu9.18) ...
正在选中未选择的软件包 libc6-x32。
准备解压 .../02-libc6-x32_2.31-0ubuntu9.18_amd64.deb  ...
正在解压 libc6-x32 (2.31-0ubuntu9.18) ...
正在选中未选择的软件包 libc6-dev-x32。
准备解压 .../03-libc6-dev-x32_2.31-0ubuntu9.18_amd64.deb  ...
正在解压 libc6-dev-x32 (2.31-0ubuntu9.18) ...
正在选中未选择的软件包 lib32gcc-s1。
准备解压 .../04-lib32gcc-s1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 lib32gcc-s1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 libx32gcc-s1。
准备解压 .../05-libx32gcc-s1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 libx32gcc-s1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32gomp1。
准备解压 .../06-lib32gomp1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 lib32gomp1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 libx32gomp1。
准备解压 .../07-libx32gomp1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 libx32gomp1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32itm1。
准备解压 .../08-lib32itm1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 lib32itm1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 libx32itm1。
准备解压 .../09-libx32itm1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 libx32itm1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32atomic1。
准备解压 .../10-lib32atomic1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 lib32atomic1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 libx32atomic1。
准备解压 .../11-libx32atomic1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 libx32atomic1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32asan5。
准备解压 .../12-lib32asan5_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 lib32asan5 (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 libx32asan5。
准备解压 .../13-libx32asan5_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 libx32asan5 (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 lib32stdc++6。
准备解压 .../14-lib32stdc++6_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 lib32stdc++6 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32ubsan1。
准备解压 .../15-lib32ubsan1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 lib32ubsan1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 libx32stdc++6。
准备解压 .../16-libx32stdc++6_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 libx32stdc++6 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 libx32ubsan1。
准备解压 .../17-libx32ubsan1_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 libx32ubsan1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32quadmath0。
准备解压 .../18-lib32quadmath0_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 lib32quadmath0 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 libx32quadmath0。
准备解压 .../19-libx32quadmath0_10.5.0-1ubuntu1~20.04_amd64.deb  ...
正在解压 libx32quadmath0 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32gcc-9-dev。
准备解压 .../20-lib32gcc-9-dev_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 lib32gcc-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 libx32gcc-9-dev。
准备解压 .../21-libx32gcc-9-dev_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 libx32gcc-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 gcc-9-multilib。
准备解压 .../22-gcc-9-multilib_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 gcc-9-multilib (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 gcc-multilib。
准备解压 .../23-gcc-multilib_4%3a9.3.0-1ubuntu2_amd64.deb  ...
正在解压 gcc-multilib (4:9.3.0-1ubuntu2) ...
正在设置 libc6-x32 (2.31-0ubuntu9.18) ...
正在设置 libx32gomp1 (10.5.0-1ubuntu1~20.04) ...
正在设置 libc6-i386 (2.31-0ubuntu9.18) ...
正在设置 libx32quadmath0 (10.5.0-1ubuntu1~20.04) ...
正在设置 lib32atomic1 (10.5.0-1ubuntu1~20.04) ...
正在设置 libx32atomic1 (10.5.0-1ubuntu1~20.04) ...
正在设置 libc6-dev-i386 (2.31-0ubuntu9.18) ...
正在设置 lib32itm1 (10.5.0-1ubuntu1~20.04) ...
正在设置 libx32gcc-s1 (10.5.0-1ubuntu1~20.04) ...
正在设置 libx32itm1 (10.5.0-1ubuntu1~20.04) ...
正在设置 libc6-dev-x32 (2.31-0ubuntu9.18) ...
正在设置 lib32gomp1 (10.5.0-1ubuntu1~20.04) ...
正在设置 lib32gcc-s1 (10.5.0-1ubuntu1~20.04) ...
正在设置 lib32stdc++6 (10.5.0-1ubuntu1~20.04) ...
正在设置 libx32asan5 (9.4.0-1ubuntu1~20.04.2) ...
正在设置 lib32quadmath0 (10.5.0-1ubuntu1~20.04) ...
正在设置 lib32asan5 (9.4.0-1ubuntu1~20.04.2) ...
正在设置 libx32stdc++6 (10.5.0-1ubuntu1~20.04) ...
正在设置 libx32ubsan1 (10.5.0-1ubuntu1~20.04) ...
正在设置 lib32ubsan1 (10.5.0-1ubuntu1~20.04) ...
正在设置 lib32gcc-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在设置 libx32gcc-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在设置 gcc-9-multilib (9.4.0-1ubuntu1~20.04.2) ...
正在设置 gcc-multilib (4:9.3.0-1ubuntu2) ...
正在处理用于 libc-bin (2.31-0ubuntu9.18) 的触发器 ...
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install -y g++-multilib libc6-i386 lib32ncurses5 lib32stdc++6
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
E: 无法定位软件包 lib32ncurses5
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install -y g++-multilib
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
将会同时安装下列软件:
  g++-9-multilib lib32stdc++-9-dev libx32stdc++-9-dev
建议安装:
  lib32stdc++6-9-dbg libx32stdc++6-9-dbg
下列【新】软件包将被安装:
  g++-9-multilib g++-multilib lib32stdc++-9-dev libx32stdc++-9-dev
升级了 0 个软件包,新安装了 4 个软件包,要卸载 0 个软件包,有 3 个软件包未被升级。
需要下载 1,473 kB 的归档。
解压缩后会消耗 21.1 MB 的额外空间。
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32stdc++-9-dev amd64 9.4.0-1ubuntu1~20.04.2 [762 kB]
获取:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libx32stdc++-9-dev amd64 9.4.0-1ubuntu1~20.04.2 [709 kB]
获取:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 g++-9-multilib amd64 9.4.0-1ubuntu1~20.04.2 [1,084 B]
获取:4 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal/main amd64 g++-multilib amd64 4:9.3.0-1ubuntu2 [1,044 B]
已下载 1,473 kB,耗时 3秒 (533 kB/s)
正在选中未选择的软件包 lib32stdc++-9-dev。
(正在读取数据库 ... 系统当前共安装有 265759 个文件和目录。)
准备解压 .../lib32stdc++-9-dev_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 lib32stdc++-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 libx32stdc++-9-dev。
准备解压 .../libx32stdc++-9-dev_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 libx32stdc++-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 g++-9-multilib。
准备解压 .../g++-9-multilib_9.4.0-1ubuntu1~20.04.2_amd64.deb  ...
正在解压 g++-9-multilib (9.4.0-1ubuntu1~20.04.2) ...
正在选中未选择的软件包 g++-multilib。
准备解压 .../g++-multilib_4%3a9.3.0-1ubuntu2_amd64.deb  ...
正在解压 g++-multilib (4:9.3.0-1ubuntu2) ...
正在设置 lib32stdc++-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在设置 libx32stdc++-9-dev (9.4.0-1ubuntu1~20.04.2) ...
正在设置 g++-9-multilib (9.4.0-1ubuntu1~20.04.2) ...
正在设置 g++-multilib (4:9.3.0-1ubuntu2) ...
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install -y lib32ncurses5
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
E: 无法定位软件包 lib32ncurses5
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install -y lib32stdc++6
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
lib32stdc++6 已经是最新版 (10.5.0-1ubuntu1~20.04)。
lib32stdc++6 已设置为手动安装。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 3 个软件包未被升级。
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc -Wa,"--32" -Wl,"-melf_i386" hello.cb
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ ls
bin               ChangeLog  hello.cb  import      Makefile   test   unit
build.properties  docker     hello.o   install.sh  net        ToDo
build.xml         hello      hello.s   lib         README.md  tools
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ ls -al
总用量 264
drwxrwxr-x 10 zzq zzq   4096 8月  15 11:34 .
drwxrwxr-x  7 zzq zzq   4096 8月  15 11:16 ..
drwxrwxr-x  2 zzq zzq   4096 10月 16  2016 bin
-rw-rw-r--  1 zzq zzq    204 10月 16  2016 build.properties
-rw-rw-r--  1 zzq zzq   1856 10月 16  2016 build.xml
-rw-rw-r--  1 zzq zzq 168778 10月 16  2016 ChangeLog
drwxrwxr-x  2 zzq zzq   4096 10月 16  2016 docker
-rwxrwxr-x  1 zzq zzq  14492 8月  15 11:34 hello
-rw-rw-r--  1 zzq zzq     92 8月  15 11:25 hello.cb
-rw-rw-r--  1 zzq zzq    680 8月  15 11:34 hello.o
-rw-rw-r--  1 zzq zzq    283 8月  15 11:34 hello.s
drwxrwxr-x  3 zzq zzq   4096 10月 16  2016 import
-rwxr-xr-x  1 zzq zzq    687 10月 16  2016 install.sh
drwxrwxr-x  2 zzq zzq   4096 10月 16  2016 lib
-rw-rw-r--  1 zzq zzq    682 10月 16  2016 Makefile
drwxrwxr-x  3 zzq zzq   4096 10月 16  2016 net
-rw-rw-r--  1 zzq zzq   2283 10月 16  2016 README.md
drwxrwxr-x  2 zzq zzq   4096 10月 16  2016 test
-rw-rw-r--  1 zzq zzq   7015 10月 16  2016 ToDo
drwxrwxr-x  2 zzq zzq   4096 10月 16  2016 tools
drwxrwxr-x  2 zzq zzq   4096 10月 16  2016 unit
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ ./hello
Hello, World!
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cat hello.o
ELF@4( U��P�����������]�Hello, World!
��
hello.cbmainprintf
.symtab.strtab.shstrtab.rel.text.data.bss.rodata4    %PP0P`�    8zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cat hello.s
.file    "hello.cb"
    .section    .rodata
.LC0:
    .string    "Hello, World!\n"
    .text
.globl main
    .type    main,@function
main:
    pushl    %ebp
    movl    %esp, %ebp
    movl    $.LC0, %eax
    pushl    %eax
    call    printf
    addl    $4, %esp
    movl    $0, %eax
    jmp    .L0
.L0:
    movl    %ebp, %esp
    popl    %ebp
    ret
    .size    main,.-main
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc
cbc: error: no input file
cbc: error: Try "cbc --help" for usage
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc --help
Usage: cbc [options] file...
Global Options:
  --check-syntax   Checks syntax and quit.
  --dump-tokens    Dumps tokens and quit.
  --dump-ast       Dumps AST and quit.
  --dump-semantic  Dumps AST after semantic checks and quit.
  --dump-ir        Dumps IR and quit.
  --dump-asm       Dumps AssemblyCode and quit.
  --print-asm      Prints assembly code and quit.
  -S               Generates an assembly file and quit.
  -c               Generates an object file and quit.
  -o PATH          Places output in file PATH.
  -v               Turn on verbose mode.
  --version        Shows compiler version and quit.
  --help           Prints this message and quit.

Optimization Options:
  -O               Enables optimization.
  -O1, -O2, -O3    Equivalent to -O.
  -Os              Equivalent to -O.
  -O0              Disables optimization (default).

Parser Options:
  -I PATH          Adds PATH as import file directory.
  --debug-parser   Dumps parsing process.

Code Generator Options:
  -O               Enables optimization.
  -O1, -O2, -O3    Equivalent to -O.
  -Os              Equivalent to -O.
  -O0              Disables optimization (default).
  -fPIC            Generates PIC assembly.
  -fpic            Equivalent to -fPIC.
  -fPIE            Generates PIE assembly.
  -fpie            Equivalent to -fPIE.
  -fverbose-asm    Generate assembly with verbose comments.

Assembler Options:
  -Wa,OPT          Passes OPT to the assembler (as).
  -Xassembler OPT  Passes OPT to the assembler (as).

Linker Options:
  -l LIB           Links the library LIB.
  -L PATH          Adds PATH as library directory.
  -shared          Generates shared library rather than executable.
  -static          Linkes only with static libraries.
  -pie             Generates PIE.
  --readonly-got   Generates read-only GOT (ld -z combreloc -z now -z relro).
  -nostartfiles    Do not link startup files.
  -nodefaultlibs   Do not link default libraries.
  -nostdlib        Enables -nostartfiles and -nodefaultlibs.
  -Wl,OPT          Passes OPT to the linker (ld).
  -Xlinker OPT     Passes OPT to the linker (ld).
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc -Wa,"--32" -Wl,"-melf_i386" hello.cb
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ ./hello
Hello, World!
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$


=====================================================
lib32ncurses5
将apt-get install lib32ncurses5改为apt-get install lib32ncurses5-dev

实际上在ubuntu20.4LTS 64位版本上安装时,也并没有安装这个lib32ncurses5-dev,而是自动安装了lib32ncurses-dev,这同时安装了三个东西:

ib32ncurses6 lib32ncursesw6 lib32tinfo6

靠,确实比较复杂
======================================================
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install lib32ncurses5-dev
[sudo] zzq 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
注意,选中 'lib32ncurses-dev' 而非 'lib32ncurses5-dev'
将会同时安装下列软件:
  lib32ncurses6 lib32ncursesw6 lib32tinfo6
建议安装:
  ncurses-doc
下列【新】软件包将被安装:
  lib32ncurses-dev lib32ncurses6 lib32ncursesw6 lib32tinfo6
升级了 0 个软件包,新安装了 4 个软件包,要卸载 0 个软件包,有 3 个软件包未被升级。
需要下载 642 kB 的归档。
解压缩后会消耗 3,098 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32tinfo6 amd64 6.2-0ubuntu2.1 [87.1 kB]
获取:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32ncurses6 amd64 6.2-0ubuntu2.1 [108 kB]
获取:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32ncursesw6 amd64 6.2-0ubuntu2.1 [142 kB]
获取:4 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 lib32ncurses-dev amd64 6.2-0ubuntu2.1 [306 kB]
已下载 642 kB,耗时 2秒 (305 kB/s)        
正在选中未选择的软件包 lib32tinfo6。
(正在读取数据库 ... 系统当前共安装有 265825 个文件和目录。)
准备解压 .../lib32tinfo6_6.2-0ubuntu2.1_amd64.deb  ...
正在解压 lib32tinfo6 (6.2-0ubuntu2.1) ...
正在选中未选择的软件包 lib32ncurses6。
准备解压 .../lib32ncurses6_6.2-0ubuntu2.1_amd64.deb  ...
正在解压 lib32ncurses6 (6.2-0ubuntu2.1) ...
正在选中未选择的软件包 lib32ncursesw6。
准备解压 .../lib32ncursesw6_6.2-0ubuntu2.1_amd64.deb  ...
正在解压 lib32ncursesw6 (6.2-0ubuntu2.1) ...
正在选中未选择的软件包 lib32ncurses-dev。
准备解压 .../lib32ncurses-dev_6.2-0ubuntu2.1_amd64.deb  ...
正在解压 lib32ncurses-dev (6.2-0ubuntu2.1) ...
正在设置 lib32tinfo6 (6.2-0ubuntu2.1) ...
正在设置 lib32ncurses6 (6.2-0ubuntu2.1) ...
正在设置 lib32ncursesw6 (6.2-0ubuntu2.1) ...
正在设置 lib32ncurses-dev (6.2-0ubuntu2.1) ...
正在处理用于 libc-bin (2.31-0ubuntu9.18) 的触发器 ...
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc -Wa,"--32" -Wl,"-melf_i386" hello.cb
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ ./hello
Hello, World!
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$


zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ sudo apt-get install  ncurses-doc
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
下列【新】软件包将被安装:
  ncurses-doc
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 3 个软件包未被升级。
需要下载 672 kB 的归档。
解压缩后会消耗 3,697 kB 的额外空间。
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 ncurses-doc all 6.2-0ubuntu2.1 [672 kB]
已下载 672 kB,耗时 1秒 (533 kB/s)  
正在选中未选择的软件包 ncurses-doc。
(正在读取数据库 ... 系统当前共安装有 265877 个文件和目录。)
准备解压 .../ncurses-doc_6.2-0ubuntu2.1_all.deb  ...
正在解压 ncurses-doc (6.2-0ubuntu2.1) ...
正在设置 ncurses-doc (6.2-0ubuntu2.1) ...
正在处理用于 man-db (2.9.1-1) 的触发器 ...
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$


zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc  hello.cb
hello.s: Assembler messages:
hello.s:9: 错误: invalid instruction suffix for `push'
hello.s:12: 错误: invalid instruction suffix for `push'
hello.s:19: 错误: invalid instruction suffix for `pop'
cbc: error: as failed. (status 1)
cbc: error: compile error
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ cbc -Wa,"--32" -Wl,"-melf_i386" hello.cb
zzq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master$ ./hello
Hello, World!

安装成功,cbc在64位 ubuntu20.4LTS 上可以成功编译hello.cb


=========================================================================================
也可以把cbc 在64 ubuntu20.4LTS上的编译命令   cbc -Wa,"--32" -Wl,"-melf_i386"    缩写成  cbc 然后写入 ~/.bashrc
==========================================================================================

 

===========================================================
zq@zzq:~/下载/自制编译器cb/cbc-ubuntu-64bit-master/docker$ cat Dockerfile
# This dockerfile use the ubuntu image
FROM ubuntu:16.04

# maintainer is leungwensen <leungwensen@gmail.com>
MAINTAINER leungwensen <leungwensen@gmail.com>

# commands to update the image
RUN apt-get update && apt-get install -y \
            gcc-multilib g++-multilib libc6-i386 lib32ncurses5 lib32stdc++6 \
            openjdk-8-jre \
            git

RUN git clone https://github.com/leungwensen/cbc-ubuntu-64bit.git

RUN cd cbc-ubuntu-64bit && bash install.sh

RUN echo 'PATH=/usr/local/cbc/bin:$PATH' >> $HOME/.bashrc

RUN echo 'alias cbc="cbc -Wa,--32 -Wl,-melf_i386"' >> $HOME/.bashrc

source ~/.bashrc

# commands when creating a new container

注意以下这一句:
RUN echo 'alias cbc="cbc -Wa,--32 -Wl,-melf_i386"' >> $HOME/.bashrc
这样就可以建立一个 cbc -Wa,--32 -Wl,-melf_i386" 的命令别名,省的输入一大堆参数,当然这只限于在 ubuntu20.4LTS 64位 上运行cbc,为了兼容32位的情况

 

posted @ 2025-08-15 16:13  Thermo  阅读(15)  评论(0)    收藏  举报