- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在过去的几天里,我一直试图了解当我们执行一个 C 程序时幕后会发生什么。然而,即使在阅读了大量帖子后,我也找不到详细而准确的解释。有人可以帮我吗?
最佳答案
在编译和链接程序时,您通常会为特定用途找到这样的特殊名称。
通常,类似于 _start
将是可执行文件的实际入口点,它将位于某个目标文件或库中(例如 crt0.o
用于 C 运行时启动代码) - 这通常会由链接器自动添加到您的可执行文件中,类似添加 C 运行时库的方式(a)。
用于启动程序的操作系统代码将类似于(显然是伪代码,并且错误检查比它应该有的要少得多):
def spawnProg(progName):
id = newProcess() # make process address space
loadProgram(pid = id, file = progName) # load program into it
newThread(pid, initialPc = '_start') # make new thread to run it
即使您自己创建了一个
main
当用 C 编码时,这并不是真正开始发生的地方。在主程序启动之前,还有很多事情需要完成。因此,C 启动代码的内容将类似于(最简单的):
_start: ;; Weave magic here to set up C and libc.
call __setup_for_c ; set up C environment
call __libc_start_main ; set up standard library
call _main ; call your main
call __libc_stop_main ; tear down standard library
call __teardown_for_c ; tear down C environment
jmp __exit ; return to OS
“魔法编织”是为 C 程序准备环境所需的一切。这可能包括以下内容:
argc
和 argv
在堆栈上,甚至准备堆栈本身(有可能用于 C 的特定调用约定,并且很可能操作系统在调用 _start
时根本不需要设置堆栈,因为进程的需要不知道); main
功能。也有可能在您的
main
之后需要完成工作退出,例如:
atexit
处理程序(您希望在退出时自动运行的东西,无论退出发生在哪里); _start
低级工作的例行公事。
关于c - __libc_start_main 和 _start 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62709030/
我正在编写一个库,它可以挂接一些 CUDA 函数以添加一些功能。 “构造函数” Hook CUDA 函数并设置消息队列和共享内存以与其他 Hook 的 CUDA 二进制文件通信。当启动几个 Hook
我真的很想了解高级代码 -> 可执行文件的步骤.. 但我遇到了一些困难。 我写了一个空的 int main() {} C 文件,并试图通过 objdump -d 破译反汇编。这是正在发生的事情: 在_
以下是我的代码,只是一个strok的例子 #include "stdio.h" #include "string.h" #include "stdlib.h" #define NUMBER_OF_ST
为了研究目标文件在linux下是如何加载和运行的,我做了一个最简单的c代码,文件名simple.c。 int main(){} 接下来,我制作目标文件并将目标文件保存为文本文件。 $gcc ./sim
我开始进入逆向工程,正在使用 IDA Pro 并正在致力于反汇编二进制文件。 我试图找到 main 的内存地址我正在使用的 C 程序的功能。 但是,我看到 IDA 中有一个函数用于:main和 __l
在过去的几天里,我一直试图了解当我们执行一个 C 程序时幕后会发生什么。然而,即使在阅读了大量帖子后,我也找不到详细而准确的解释。有人可以帮我吗? 最佳答案 在编译和链接程序时,您通常会为特定用途找到
我想做的很简单。当我启动 Mongoose 服务器时,我想创建一个额外的线程来做一些额外的工作。为此,我认为我需要 LD_PRELOAD 服务器的 __libc_start_main。 /* This
我试图理解 __libc_start_main() 中对 main() 的调用。我知道 __libc_start_main() 的参数之一是 main() 的地址。但是,我无法弄清楚 main() 在
在以下原型(prototype)中: int __libc_start_main( int (*main) (int, char * *, char * *), int argc, c
我有一个用 C 语言编写的 CGI 脚本。我知道这在当今时代是非正统的,但我有我的理由。此外,它是使用 -static 编译的,因此我不必担心我的 Web 提供商上的共享库。该脚本已经运行一年多了,但
我是一名优秀的程序员,十分优秀!