标签: compiler

如何从头编译C编译器,然后从头编译Unix/Linux

假设我在美国/英国以外的一家大型服务机构工作。我们广泛使用 UNIX 和 Linux 服务器。

通读这篇文章,它提到将后门插入 C 编译器很容易,然后用该编译器编译的任何代码也将包含后门。现在鉴于最近有关 NSA/GCHQ 授权在所有加密方法、硬件和软件中放置后门/弱点的泄密事件,编译器现在是一个关键的故障点。可能所有标准的 UNIX/Linix 发行版都可能受到损害。我们不能让流氓政府损害我们的系统、数据和客户数据。

鉴于这些信息,我想从头开始构建一个受信任的编译器,然后我有一个安全的基础来构建,这样我就可以使用该编译器从源代码构建操作系统和应用程序。

从源代码编译编译器(一个看似鸡生蛋的场景)然后从头开始编译受信任的 Unix/Linux 发行版的正确(和安全方法)是什么?

您可以假设我或其他人有能力阅读和理解安全漏洞的源代码,因此在编译之前将首先审查源代码。我真正想要的是一份从头开始安全地生成这个编译器的工作指南,可用于编译内核、操作系统的其他部分和应用程序。

如果我们要对在该堆栈上运行的操作系统或应用程序有任何信心,安全堆栈必须从基础级别开始。是的,我知道可能存在硬件后门,它们可能会在编译器构建时将一些微代码插入到编译器中。除了可能使用不是在美国设计的芯片之外,我们目前对此无能为力。让我们先对这一层进行排序,并假设我可以在插入任何后门之前在旧计算机上构建它。

正如布鲁斯·施奈尔 (Bruce Schneier) 所说:“我对工程师们说:我们建立了互联网,我们中的一些人帮助颠覆了它。现在,我们这些热爱自由的人必须修复它。”

额外链接:

linux compiling kernel compiler gcc

64
推荐指数
3
解决办法
4685
查看次数

我们可以从 elf 二进制文件中获取编译器信息吗?

有没有机会知道在 Linux 下如何构建二进制文件?(和或其他 Unix)

编译器、版本、时间、标志等...

我查看readelf并找不到太多内容,但可能还有其他方法可以分析二进制代码/部分等...

你知道怎么提取吗?

linux debugging compiler executable elf

62
推荐指数
5
解决办法
8万
查看次数

当静态链接到 .a 文件时,C 编译器是否会丢弃未使用的函数?

假设我有一个静态main.c链接到libmine.a. 静态链接到库会导致库函数在编译时嵌入到主可执行文件中。

如果libmine.a要提供 未使用的函数main.c,编译器(例如 GCC)会丢弃这些函数吗?

这个问题的灵感来自于“常见消息传递”,即使用静态库会使可执行文件更大,所以我很好奇编译器是否至少从存档文件中删除未使用的代码。

compiling c compiler libraries static-linking

35
推荐指数
2
解决办法
9482
查看次数

如果我没有足够的空间来安装 GCC,如何为 Linux 编译一些东西?

我购买了人机界面 (Exor Esmart04)。在 Linux 3.10.12 上运行,但是这个 Linux 被精简并且没有 C 编译器。另一个问题是磁盘空间:

磁盘空间片段

我已经尝试在其上安装 GCC,但我没有足够的磁盘空间,是否有人有其他解决方案或其他需要较少磁盘空间的 C 编译器?

linux compiler disk-usage shell-script

23
推荐指数
1
解决办法
4949
查看次数

编译后的 shell 脚本对性能更好吗?

经过一番谷歌搜索,我找到了一种将 BASH 脚本编译为二进制可执行文件的方法(使用shc)。

我知道 shell 是一种解释性语言,但是这个编译器有什么作用呢?它会以任何方式提高我的脚本的性能吗?

performance shell compiling compiler

21
推荐指数
3
解决办法
3694
查看次数

为什么我不能运行这个 C 程序?

我正在尝试运行我的第一个“进程”程序,但出现以下错误:

./fork.c: line 4: syntax error near unexpected token `('
./fork.c: line 4: `int main()'
Run Code Online (Sandbox Code Playgroud)

我很确定代码是正确的:

 #include <sys/types.h>
 #include <stdio.h>
 int main() {
     pid_t pid;
     printf("Hello fork()\n");
     switch(pid=fork())  {
         case -1: printf("Error by fork().....\n"); exit(0);
         case 0: printf("I'm the child process \n"); break;
         default: printf("I'm the dad \n"); break;
     }
  exit(0);
}
Run Code Online (Sandbox Code Playgroud)

怎么了?

c compiler

12
推荐指数
2
解决办法
7234
查看次数

如何从 .py 文件中获取二进制文件

我需要一个程序来编译python源代码;正如我一开始发现的那样,我需要从我的 python 脚本中创建一个二进制文件。

我已经检查了很多链接,但仍然没有找到适用于 Linux 的东西。

我找到py2bin了 OS/X,但没有适用于 Linux 的版本。

linux compiler python

12
推荐指数
2
解决办法
4万
查看次数

make如何继续编译?

我知道我可以make随时中断进程,而无需再次重新编译整个源代码树。据我所知,make只有在尚未编译的情况下才编译目标,或者在上次编译后修改了源代码。
但是如果我中断make,肯定会有一个或多个(取决于并发级别)半就绪的二进制文件。下次我跑步时,它们对我有make什么作用?或者当我按Ctrl+C以避免部分编译的二进制文件时它是否完成了当前目标?

linux compiling make compiler interrupt

11
推荐指数
2
解决办法
7471
查看次数

如何获得静态 C 编译器?

我在玩 chroot 环境,我想要一个可移植的 C 编译器,这样我就可以在每个环境中轻松设置一些基本的构建工具,而不必移动太多的库。

对于我想做的事情,gcc 似乎很臃肿,但是如果构建静态 gcc 相当容易,我不会介意几十兆字节。

我也在看 Tiny C Compiler,它更小,但看起来仍然有令人印象深刻的功能集。但是,在源目录中运行 ./configure --help 没有列出任何用于静态构建 tcc 的选项,我不确定否则如何完成。

c compiler gcc static-linking

8
推荐指数
1
解决办法
1万
查看次数

如何从版本 6 Unix 理解这个 TMG 的汇编代码?

Unix 的早期版本包括 Doug McIlroy 的工具tmg(“transmogrifier”),一个早期的编译器-编译器。TMG 是用 Dennis Ritchie 的汇编语言以及 TMGL 本身(TMG 翻译成汇编的语言)实现的。这是TMG 的手册(1972)。是来自第 6 版 Unix 的完整源代码。

由于我试图了解 McIlroy 对 TMG 的实施是如何工作的,因此我正在阅读该文件tmgl.s,这tmgl.t是由 TMG 完成的翻译。我对以下摘录感到困惑:

.1=.
1
.2=.
2
.3=.
Run Code Online (Sandbox Code Playgroud)

和:

goto;..2
..3:null
..2:
Run Code Online (Sandbox Code Playgroud)

我阅读了PAL-11RUnix 汇编手册,但不记得有任何解释。

特别:

  • .意思是“位置计数器”,但什么是.3=.
  • ..意思是“搬迁柜台”,但什么是..3

(更糟糕的是,这种语法似乎只在 TMG 实现中遇到,而不是 Unix V6 的任何其他源文件。而且,为了排除损坏代码或逐步淘汰语法的可能性,TMG 源实际上是在Python 中编译的运行 Unix V6 的PDP-11 模拟器。)

compiler historical-unix assembly

6
推荐指数
1
解决办法
274
查看次数