如何编译c程序使其不依赖任何库?

2024-01-05

看来即使是一个 hello world 程序也依赖于几个库:

libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)

我怎样才能静态链接所有的东西?


链接至-static。 “在支持动态链接的系统上,这会阻止与共享库的链接。”

编辑:是的,这会增加可执行文件的大小。您可以走两条路,要么按照 Marco van de Voort 的建议进行(-nostdlib,烘焙您自己的标准库或找到一个最小的标准库)。

另一种途径是尝试让 GCC 尽可能多地删除。

gcc  -Wl,--gc-sections -Os -fdata-sections -ffunction-sections -ffunction-sections -static test.c -o test
strip test

在我的机器上将一个小测试从约 800K 减少到约 700K,因此减少量并不是那么大。

以前的SO讨论:
来自其他链接单元的垃圾 https://stackoverflow.com/questions/4815177/garbage-from-other-linking-units
与 gcc 静态链接时如何仅包含使用过的符号? https://stackoverflow.com/questions/5307348/how-do-i-include-only-used-symbols-when-statically-linking-with-gcc
使用 GCC 查找无法访问的函数(“死代码”) https://stackoverflow.com/questions/4195494/using-gcc-to-find-unreachable-functions-dead-code

Update2:如果您满足于仅使用系统调用,则可以使用gcc -ffreestanding -nostartfiles -static获得非常小的可执行文件。

试试这个文件(small.c):

#include <unistd.h>

void _start() {
    char msg[] = "Hello!\n";
    write(1, msg, sizeof(msg));
    _exit(0);
}

编译使用:gcc -ffreestanding -nostartfiles -static -o small small.c && strip small。这会在我的系统上生成一个约 5K 的可执行文件(其中仍然有一些应该可剥离的部分)。如果你想进一步查看this http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html guide.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编译c程序使其不依赖任何库? 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p

随机推荐

  • Clojure 警告:“结果集序列已存在于 clojure.core 中”

    我是 Clojure 的新手 正在使用 Noir 框架构建一个 Web 应用程序 与 Compojure 非常相似 事实上我认为它是具有不同请求处理程序层的 Compojure 导入 JDBC 库时收到警告 WARNING resultse
  • php从邮件正文中提取文本/纯文本

    这是 imap php 库读取的一封邮件的内容 我会提取内容类型 text plain 字符集 ISO 8859 1 文本 data 10 10 2011 regione pt provincia pistoia nome nome tel
  • Cake PHP 3 debug_kit 面板

    安装 CakePHP3 版本后 3 6 2 debug kit不显示面板 在日志文件中 警告 DebugKit 正在禁用自身作为您的主机newtest my不在已知的顶级域安全列表中 localhost dev invalid test e
  • 如何在seaborn python中合并两个relplot?

    我想使用 sns relplot 在单个图中绘制数据帧的两个数据列 数据框如下所示 index x axis col1 col2 group group2 0 0 27 26 A C 1 1 45 27 B D 2 2 48 22 A C
  • 如何从派生类获取基类实例

    我不知道这是否可能 但我正在尝试从派生类获取基类实例 在 C 中 我可以使用base关键字来访问基类的属性和方法 当然 但我想使用base本身 尝试这样做会导致 在此上下文中使用关键字 base 无效 error 示例代码 public c
  • 当浏览器选项卡关闭时销毁会话

    我有用户登录 注销应用程序 我想销毁会话 当我关闭浏览器 所有选项卡 时它工作正常 IE Firefox 工作 但我想在用户关闭单个选项卡时销毁会话 我在用 session set cookie params 0 session start
  • Web Api GET 方法可能具有可为 null 的 Guid 吗?

    我有一个 MVC Web API get 方法 我希望能够将可为空的 Guid 作为参数传递 如果我使用 Id null 设置 GET 我会收到 400 响应 我可以传递一个空的指南 但我宁愿不这样做 无论我将 URI 更改为 id id
  • 测试应用内购买是否需要有效的付费应用程序合同?

    我正在关注一个应用内购买教程 http www raywenderlich com 21081 introduction to in app purchases in ios 6 tutorial它还展示了如何使用沙箱环境 http dev
  • 无法找到或加载程序集“tmpAssembly,

    我正在尝试使用动态生成的类型作为名为 codeeffects www codeeffects com 的业务规则编辑器的源 但是我收到此异常 Could not find or load assembly tmpAssembly Versi
  • IIS 管理器错误数据。 0x80090005

    当我尝试在 高级设置 中设置物理路径凭据时 收到如下错误消息 Internet 信息服务 IIS 管理器 坏数据 HRESULT 异常 0x80090005 它阻止我设置特定用户来访问网络共享文件夹 奇怪的是 我有另一台具有相同配置的服务器
  • APE 和 Node.js 之间的主要区别是什么?

    有谁用过的可以分享一下经验吗 主要区别是什么 您更喜欢哪一个 谢谢 socket io 与 APE 的不同之处 socket io 是用 javascript node js 编码的 而 APE 是用 C 编码的 我相信当你想做出贡献时 这
  • 根据属性将 JavaScript 中的对象数组拆分为单独的数组

    我有一个像这样的数组 var flightPlanCoordinates lat 37 772 lng 122 214 status walking lat 36 772 lng 123 214 status walking lat 21
  • 禁用“您所做的更改可能无法保存”弹出窗口

    我使用以下前端代码导出 csv文档 HTML
  • 在 Vim 中同时保存并运行

    我做了很多 Python 快速模拟工作 并且不断保存 w 然后运行 有没有办法将这些动作结合起来 也许是 保存并运行 命令 好的 您正在寻找的最简单形式是管道命令 它允许您在同一行上运行多个 cmdline 命令 在您的情况下 这两个命令是
  • PowerShell:从文本文件读取行,构造源文件名和目标文件名,然后复制文件

    I m a 电源外壳 http en wikipedia org wiki Windows PowerShell新手 我很想能够编写这个脚本 我有一个文本文件 其中每一行都是文件名的一部分 没有路径或扩展名 我想要一个单行循环遍历文件的每一
  • 将字符串添加到 ArrayList [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要确保我正在正确构建这个程序 我
  • Python 抽象类 - 如何阻止实例化?

    我有 C 背景 该语言具有一些内置的 保护开发人员 功能 我知道 Python 采用 我们都是成年人 的方法 并让开发人员有责任深思熟虑 仔细编码 也就是说 Python 建议采用约定 例如私有实例变量的前导下划线 我的问题是 除了在文档字
  • Oracle 二进制数据类型

    有没有一种类型或方法如何在oracle中以二进制级别存储数据 我对 dml at table 和 pl sql 的操作都感兴趣 目前所有二进制元素都存储为 varchar2 1000 11111 0000 1111 但操作和数据存储大小相当
  • 创建 MySQL 存储过程来更新记录

    我正在转换所有现有的 MSSQL 数据库 并且存储过程被困在一个新的存储过程中 我需要在其中更新现有记录 一旦记录插入数据库并成功发送电子邮件 或至少传递到 SMTP 服务器 就会从 Web 表单调用该过程 我在 MSSQL 中有一个工作程
  • 如何编译c程序使其不依赖任何库?

    看来即使是一个 hello world 程序也依赖于几个库 libc so 6 gt lib64 libc so 6 0x00000034f4000000 lib64 ld linux x86 64 so 2 0x00000034f3c00