C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 在C或汇编中制作一个简单的CRT0大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我带着C/C++和ASM回来了,我想用火来玩一点.我发现当您编译代码并将其链接Windows的可执行文件时,它会动态链接到某些必须存在于该应用程序运行的计算机上的库.您可以指定编译器不链接它们并为此创建自己的库.

除此之外(如果我在这里所说的一切都错了,请纠正我)有一个目标文件总是被编译并链接在@R_66_9616@程序的主要代码中.它是crt0.o(C运行时)文件,据我所知,它准备堆栈,获取argc和argv并@L_665_13@main函数(也许还有其他东西).我也相信这是系统在执行应用程序时调用的第一段代码.

所以,我试图创建一个简单的crt0.obj并将其链接一个简单的C对象文件

int main(int argc,char** argv) {
    return 0; 
}

我使用GCC,我想不使用标准库,所以我的命令如下:

g++ -s -nostartfiles -nodefaultlibs -nostdlib testapp.cpp -o test.exe crt0.o

我想-nostartfiles指令告诉链接器没有嵌入@L_489_22@认的crt0.o,因此它希望我给出任何函数的每个定义并处理应用程序的启动.我在这里有点困惑.

无论如何,我想创建一个非常基本的crt0目标文件,这足以让GCC创建我的可执行文件,并让系统启动它.我知道互联网上有很多代码文件(C和ASM),但我想自己编写,以了解它是如何工作的.不仅仅是代码我需要的是一些帮助,它必须做什么以及如何编译/链接以实现它.
如果您知道任何有用的链接,也非常感谢.

我的怀疑是:
1.编译器/链接如何从我的代码和C运行时创建最终文件?我是否必须从crt0.o@L_665_13@main函数(使用extern指令)?当我执行g -s -nostartfiles -nodefaultlibs -nostdlib testapp.cpp -o test.exe时,我得到“*未定义引用__main *”错误.主要功能是在crt0.o文件中定义的吗?奇怪的是,如果我通过int start更改int main,我不会收到任何错误.那是什么意思?
2.哪些是crt0必须包含的基本操作(比如获取命令行参数,@L_665_13@main)?
3.我的代码文件是CPP,crt0是C文件中的一个程序集(用GCC编译).我将发布一些“frankencode”,我设法从我发现和部分理解的部分创建:

// crt0.c
__asm(".section .text\n" 
".global _start\n"
"_start:\n"
"mov $0,%ebp\n"
"push %ebp\n"
"mov %esp,%ebp\n"
"push %esi\n"
"push %edi\n"
"call _init\n"
"pop %edi\n"
"pop %esi\n"
"call main\n"
"movl %eax,%edi\n"
"call exit\n"
".section .init\n"
".global _init\n"
"_init:\n"
"push %ebp\n"
"mov %esp,%ebp\n"
".section .fini\n"
".global _fini\n"
"_fini:\n"
"push %ebp\n"
"mov %esp,%ebp\n");

4.)所以,在这文件中,我调用了一些初始化函数. init和fini函数已经创建(它们看起来像简单的构造函数和析构函数,我不知道)还有main函数,我不知道它是如何与.cpp main函数相关的.我的意思是,我应该导入它吗?我得到主函数退出函数的未定义引用错误.
5.)c0必须具有特定格式还是包含特定功能,以便系统找到它的@R_262_11117@?

好吧,我觉得制作一个小的crt0并让编译器将它附加到可执行文件上并不困难,但是有一些我无法正确看到的东西.我希望有人能帮我把这一切都融合在一起.谢谢

解决方法

我没有要测试的Windows机器,但这应该是你需要的基本位:

#// crt0.c
__asm(".section .text\n" 
".global _start\n"
"_start:\n"
"mov $0,%ebp\n"
"call main\n"
"pop  %ebp\n"
"ret\n");

编辑:空__main:

__asm(".global __main\n"
      "__main:\n" 
      "ret\n");

大佬总结

以上是大佬教程为你收集整理的c – 在C或汇编中制作一个简单的CRT0全部内容,希望文章能够帮你解决c – 在C或汇编中制作一个简单的CRT0所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。