LINUX:是否可以编写一个不依赖libc库的工作程序?

2024-02-10

我想知道我是否可以编写一个程序C- 可执行的编程语言,尽管不使用单个库调用,例如甚至没有退出()?

如果是这样,它显然根本不依赖于库(libc、ld-linux)。


我怀疑你可以写这样的东西,但最后需要有一个无限循环,因为你不能要求操作系统退出你的进程。而你却无法做任何有用的事情。

我们从编译 ELF 程序开始,研究 ELF 规范,并将标头、程序段和程序所需的其他部分组合在一起。内核将加载您的代码并跳转到某个初始地址。你可以在那里放置一个无限循环。但如果不了解一些汇编程序,无论如何从一开始就没有希望。

The glibc 使用的文件作为起点可能很有用。尝试更改它,以便您可以从中组装出独立的可执行文件。 start.S 文件是所有 ELF 应用程序的入口点,并且是调用的文件__libc_start_main这又调用main。您只需更改它即可满足您的需求。

好吧,那是理论上的。但现在,这有什么实际用途呢?

回答更新的问题

出色地。有一个图书馆叫libgloss它为要在嵌入式系统上运行的程序提供了最小的接口。这newlibC 库使用该接口作为其系统调用接口。总体思路是libgloss是C库和操作系统之间的层。因此,它还包含操作系统跳转到的启动文件。这两个库都是 GNU binutils 项目的一部分。我用它们为另一个操作系统和另一个处理器做接口,但似乎没有适用于 Linux 的 libgloss 端口,所以如果你调用系统调用,你将不得不自己做,正如其他人已经说过的那样。

用C编程语言编写程序是完全可能的。这linux内核是此类程序的一个很好的例子。但用户程序也是可能的。但最低限度需要的是一个运行时库(如果你想做任何严肃的事情)。这样的函数将包含非常基本的函数,例如 memcpy、基本宏等等。 C 标准有一个特殊的一致性模式,称为独立式,它只需要一组非常有限的功能,也适用于内核。其实我有no clue关于 x86 汇编程序,但我尝试了一个非常简单的 C 程序:

/* gcc -nostdlib start.c */
int main(int, char**, char**);

void _start(int args)
{
    /* we do not care about arguments for main. start.S in 
     * glibc documents how the kernel passes them though.
     */
    int c = main(0,0,0);

    /* do the system-call for exit. */
    asm("movl   %0,%%ebx\n" /* first argument */
        "movl   $1,%%eax\n" /* syscall 1 */
        "int    $0x80"      /* fire interrupt */
        : : "r"(c) :"%eax", "%ebx");
}

int main(int argc, char** argv, char** env) {
    /* yeah here we can do some stuff */
    return 42;
}

我们很高兴,它实际上可以编译并运行:)

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

LINUX:是否可以编写一个不依赖libc库的工作程序? 的相关文章

  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 如何将 MPI 派生数据类型用于 3D 数组?

    我想编写一个适用于 3D 矩阵的并行代码 其中每个进程都有自己的子矩阵 但为了完成其工作 它们需要一些有关相邻进程子矩阵的信息 只是边界平面 我通过点对点通信发送这些信息 但我知道对于大型矩阵来说这不是一个好主意 因此我决定使用派生数据类型
  • Linux:如何在fork上将文件描述符标记为不可继承? [复制]

    这个问题在这里已经有答案了 是否可以在子进程中将特定文件描述符标记为不可继承或关闭它fork 被调用 不会 所有文件描述符都是在 fork 中继承的 但是 您可以将 fd 设置为在 exec 上关闭 方法是使用fcntl fd F SETF
  • 双指针如何用于二维矩阵?

    我正在通过实施康威的生命游戏来尝试 C 语言 我正在尝试动态构建两个网格 int矩阵 一个用于当前 一个用于下一代 因此在确定下一代的样子后 我只需交换指针 起初 我绝望地尝试定义指向网格的指针 例如int grid 您不能使用第二组括号作
  • 如何对 pandas 列中的列表执行 One Hot Encoding?

    假设我有一个数据框 其中一列是一个列表 未知值和长度 例如 df pd DataFrame messageLabels Good Other Bad Bad Terrible 我遇到了这个解决方案 但这不是我正在寻找的 如何最好地将包含列表
  • IE 11 找不到运行 Applet 的 Java 插件

    我使用 Java Applets 构建了应用程序 它在带有 IE 9 的 Windows 7 上运行良好 现在我正在尝试将其移动到另一个环境 有互联网浏览器 11 运行我正在使用的小程序Oracle 部署工具包脚本 http docs or
  • 为什么我们应该使用DataTemplate.DataType

    当我创建资源时 我们指定其中的数据类型
  • 源代码中字符串文字的字符编码问题

    logstring Invoke Command ComputerName filesServer ScriptBlock param logstring grp Klassenbuchordner KB grp Gruppe Gruppe
  • 使用 webpack 定义全局变量

    是否可以使用 webpack 定义一个全局变量来产生如下结果 var myvar 我看到的所有示例都使用外部文件require imports jquery file js 有几种方法可以处理全局变量 1 将变量放入模块中 Webpack
  • android中变量的全局声明

    我是android开发的新手 我正在通过SAX解析器解析xml文件并将解析的数据存储到字符串中 现在我需要在另一个类中使用该字符串 所以我需要知道如何在新类中调用该解析器 提前致谢 我总是创建一个包含所有全局变量的类 并将其称为 Const
  • OpenCV 中的照明标准化

    我正在做一个人脸识别项目 我有不同光照的图片 所以我需要进行光照标准化 我读了一篇声称可以进行照明归一化的论文 本文描述了以下功能和值 1 伽玛校正 伽玛 0 22 高斯差分 DOG 过滤 sigma 0 1 sigma 1 2 3 对比度
  • 如何使用函数创建二维数组?

    我正在尝试定义一个二维数组 但我想在函数中执行它 这是我的代码 int createArray int columns int rows int array rows for int i 0 i lt rows i array i new
  • 在 Fortran 中逐行读取逗号分隔的文本文件

    我是一名 Fortran 新手 我希望能够读取文本文件并将其内容保存在各个变量中 我发现了一个非常有用的 Fortran 教程 http www math hawaii edu hile fortran fort7 htm read htt
  • 向多个用户发送 Firebase 通知

    我正在尝试通过 Firebase 发送通知 但它不起作用 我只想将 Firebase ID 发送给所有注册用户 并将其存储在 MySQL 中 EDIT 这是下面的代码
  • 按钮可能会产生空指针异常(Android Studio)

    我是 Android Studio 的新手 我以为我做得还不错 但昨晚遇到了一个错误 尽管我尽了最大的努力 但我似乎无法修复该错误 我的一项活动上的按钮 可能会产生 java lang NullPointerException 但每次按下它
  • 如何在 Android 应用程序中使用 3G 互联网连接?

    我制作了一个应用程序 可以连接到我在服务器上运行的程序 但它似乎只适用于 WiFi 当我尝试使用 3G 时 却无法建立连接 为了使用 3G 我必须打开或设置什么特殊功能吗 在应用程序级别 您 通常 不必担心手机可以使用哪些数据连接 您是否研
  • Fragment popbackstack触发lifecyclescope收集

    情况 我提交数据setTripDeliver 收集工作正常 触发加载 然后触发成功 我按下一个按钮转到下一个片段 B 使用replace 之后 我按后退按钮 使用popbackstack 收集成功已触发 相关代码 这些代码位于Fragmen
  • 具有 iCloud 设计的核心数据

    我使用的是 iOS 7 想要通过 iCloud 使用核心数据 这运行良好 我想要一些输入的问题如下 我的一些核心数据对象具有相关的图像 大型文本文件 我将它们作为文件存储在文件系统上 并将这些项目的 url 设置为字符串属性 现在显然这不仅
  • 日志文件的大小会影响数据库的性能吗?如何缩小日志文件?

    我刚刚检查了我的日志文件 它几乎有 45GB 我有两个问题 它总体上会影响数据库的性能吗 如何用SQL查询缩小它 请举个例子 谢谢 在正常情况下 没有必要缩小事务日志文件 这通常意味着您处于完整恢复模式 而不是定期执行事务日志备份 日志文件
  • ftrace:通过 echo 从 function_graph 更改 current_tracer 时系统崩溃

    我最近一直在使用 ftrace 来监控我系统的一些行为特征 我一直在通过一个小脚本来打开 关闭跟踪 运行脚本后 我的系统会崩溃并自行重新启动 最初 我认为脚本本身可能有错误 但后来我确定崩溃和重新启动是由于echo将一些跟踪器添加到 sys
  • LINUX:是否可以编写一个不依赖libc库的工作程序?

    我想知道我是否可以编写一个程序C 可执行的编程语言 尽管不使用单个库调用 例如甚至没有退出 如果是这样 它显然根本不依赖于库 libc ld linux 我怀疑你可以写这样的东西 但最后需要有一个无限循环 因为你不能要求操作系统退出你的进程