gpt4 book ai didi

c - _start 是否调用我的程序的主函数和其他基本设置函数?

转载 作者:行者123 更新时间:2023-12-03 09:53:29 29 4
gpt4 key购买 nike

我正在阅读一本描述加载程序如何工作的教科书:

When the loader runs, it copies chunks of the executable object file into the code and data segments. Next, the loader jumps to the program’s entry point, which is always the address of the _start function. The _start function calls the system startup function, __libc_start_main

来自这个问题的回答What is __libc_start_main and _start?我们有以下关于执行流程的伪代码:

_start:
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

我的问题是:

  1. 我使用objdump检查程序的汇编代码,发现_start只调用了__libc_start_main,如下图所示:enter image description here

其余的函数如call __setup_for_c_main等怎么样?特别是我的程序的 main 函数,我看不到它是如何被调用的。那么执行流程的伪代码正确吗?

  • __libc_start_main 设置标准库是什么意思?为什么需要设置标准库?那不是说标准库只需要在程序加载的时候通过动态链接器来链接就可以了吗?
  • 最佳答案

    伪代码不是代码;) _libc_start_main() 可以调用应用程序的 main() 因为 main() 的地址将由链接器修复。编译器生成的代码进行初始化的顺序可能很有趣,但您不应该假设从一个编译器到另一个编译器,甚至从一个版本到另一个版本,它都是相同的。如果可以避免的话,最好不要依赖以特定方式完成的事情。

    至于需要初始化的内容——像 glibc 这样的标准 C 库非常复杂,需要初始化很多东西。举一个例子,必须设置内存分配器的 block 表,以便 malloc() 不会以随机的内存分配模式开始。

    关于c - _start 是否调用我的程序的主函数和其他基本设置函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63806608/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com