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库的工作程序? 的相关文章

  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock

随机推荐

  • 如何将 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 我怀疑你可以写这样的东西 但最后需要有一个无限循环 因为你不能要求操作系统退出你的进程