前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET8顶级调试(Linux_lldb)

.NET8顶级调试(Linux_lldb)

作者头像
江湖评谈
发布2023-12-20 17:01:31
1270
发布2023-12-20 17:01:31
举报
文章被收录于专栏:天下风云天下风云

前言

.NET8是多指令集,多平台的深层次技术框架。Linux和MacOS是其使用的重点,本篇来看下Linux下面的Main(托管和非托管)入口点详情。

详述

在Linux上面一般的用户态都是以libc.so库文件里面的函数为用户态入口,举个例子,比如说著名的Linux发行版界面系统Ubuntu22.04.它的一个情况具体如下。

经过一系列系统初始化,首先内核态会调用用户态的模块libc.so,加载它。此后会调用这个模块里面的函数__libc_start_main_impl,这个函数加载非托管用户态的入口函数。它调用了__libc_start_call_main函数,同样在libc.so模块里面。通过__libc_start_call_main这个函数名称,即可看出它直接调用的就是非托管Main(通用的C++里面的Main入口)。这里说个题外话的问题,Windows上面,非托管Main调用是哪个函数,哪个模块呢?

答案很简单:Windows上面,也就是微软自家平台上,调用非托管Main的是BaseThreadInitThunk函数,它所在的模块是用户态的kernel32.dll。

这里Linux和Windows可以一一对应下:

代码语言:javascript
复制
用户态入口调用模块以及函数:
Linux:libc.so -> __libc_start_main_impl
Windows:ntdll.dll -> RtlUserThreadStart

非托管Main调用模块以及函数:
Linux:libc.so -> __libc_start_call_main
windows:kernel32.dll -> BaseThreadInitThunk

除了上面的不同点,还有不同点在于:
linux调用了__libc_start_call_main函数之后,就会直接调CLR的main(corerun.cpp)
但是Windows会调用MSCV的一些库函数比如:
exewmain.cpp:wmainCRTStartup
execommoninl:__scrt_common_main
execommoninl:invoke_main
最后才是CLR Main

以上为非常简单的技术介绍,基本为入门的前置级。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江湖评谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档