main函数不一定就是程序入口

我们都知道,main函数是c程序的入口,那这个入口能不能修改?
#include int main(){ return 0;}  答案肯定是可以的,毕竟这个入口也是人为规定的。 编译分为4个步骤,预处理、编译、汇编、链接。gcc -e test.c -o test.igcc -s test.i -o test.sgcc -c test.s -o test.ogcc test.o -o test  最后一步链接的时候,需要用到一个叫做链接脚本的东西,链接脚本就是类似于这样的一个文件:output_arch( riscv ) /* 代码采用的是risc-v架构*/entry( _start ) /*代码入口符号是_start,就是汇编启动函数的符号*/memory{ /* 定义了一段起始地址为0x80000000,长度为128mb的内存区域,取名叫ram*/ ram (wxa!ri) : origin = 0x80000000, length = 128m}sections{ /* 所有输入文件中的.text段、.text.*段都合在一起,组成输出elf文件中的.text段; * 此外,定义了两个符号_text_start和_text_end ,注意符号'.'代表的是当前地址; * 生成的.text段被放在了ram这个内存区域中。 */ .text : { provide(_text_start = .); *(.text .text.*) provide(_text_end = .); } >ram .rodata : { provide(_rodata_start = .); *(.rodata .rodata.*) provide(_rodata_end = .); } >ram .data : { . = align(4096); provide(_data_start = .); *(.sdata .sdata.*) *(.data .data.*) provide(_data_end = .); } >ram .bss :{ provide(_bss_start = .); *(.sbss .sbss.*) *(.bss .bss.*) *(common) provide(_bss_end = .); } >ram provide(_memory_start = origin(ram)); provide(_memory_end = origin(ram) + length(ram)); provide(_heap_start = _bss_end); provide(_heap_size = _memory_end - _heap_start);}  它规定了程序的各个部分在内存中的位置,当然里面也包含了程序的入口:entry( _start )  只要修改了入口的名字,就能实现我们想要的功能。 那么问题又来了,平时在编译的时候,都是直接:gcc hello.c  这个过程也没看到什么链接脚本。

影驰240g固态硬盘怎么样 499元性价比爆棚
锐龙4000H标压版集体曝光 对Intel将会造成很大的冲击
是德科技跨出改革重要一步 推出PathWave 软件平台
外资品牌市场份额下滑 冰箱行业将迎来更大的挑战
2018CES的科技产品的七大发展趋势分析
main函数不一定就是程序入口
五大进展可期 2016无线充电热度扩大延烧
英特尔宣布制造扩张计划:首先在美国亚利桑那州投资200亿美元
智能家居如何实现智能化的生活
如何选择可以减轻电磁干扰的连接器
音箱分频器怎么接线_音箱分频器接线图解
诺基亚携手Optus成功推出5G固定无线接入服务
6通道逻辑/SPI/I2CμModule隔离器 通过两个可调电源轨提供超过100mA电流
RECOM推出新型150W和300W半砖DC/DC转换器
配电室智能运维改造
加码AI技术 传统AGV迎来转型升级
OPPOK3高清图赏
突破两大世界TP巨头,签订1.1亿元订单
如何使用示波器进行电信号测量?
生态进一步扩大,荣耀多款机型现已通过国家 3C 认证