linux开发
文章平均质量分 72
linux用户态开发使用技巧
少年豪放
这个作者很懒,什么都没留下…
展开
-
【动态库加载方式】动态库的两种加载方式简析
一般使用ld或者cmakelist里面指定的方式,隐式制定依赖关系,在加载一个so的时候,会同时把所有的依赖so都加载到内存里面。同一个进程dlopen同一个so,内存中不会增加副本,只会增加dlopen的指针计数(配合dlclose使用)dlopen同一个so,不会增加句柄计数,所以一个进程里面忘记dlclose一次就会增加一个句柄泄漏。dlopen之后如果立即dlclose,那么下一次dlopen获得的内存地址是一样的(参考实验)不指定dlopen的句柄,在依赖的so里面全局搜索。原创 2024-05-08 13:13:09 · 1061 阅读 · 0 评论 -
【编译】strip去除符号表
所以动态库去掉debug信息,对于gdb大部分功能没有影响(打断点、查调用栈、call函数、查内存地址)去掉,这个时候可以查看静态编译产生的二进制没有任何符号表。这个时候可以说gdb无法打断点,无法查看调用栈,可以说根本没办法使用。gdb功能基本上都围绕这符号表展开的,dbg信息主要给gdb使用,缺失dbg信息,对于静态库和动态库的影响程度不一样。动态库的重定位发生在加载过程中,这个时候虽然去掉了符号表里面的.debug这个节,但是符号表还在。静态库因为在装载的过程中没有重定位符号表的需求。原创 2024-06-30 23:55:09 · 659 阅读 · 0 评论 -
gdb上手简述
是内核对用户态提供软硬件性能数据的一个统一接口,用户通过perf_event的句柄操作能获取到各式各样的性能数据。ARM64:一般使用X0~X7 8个寄存器用来传参;使用场景:申请一块大内存(大于4k), 该内存数据不修改或者很少修改。查看寻址偏移,可以帮助我们查看操作是否为结构体成员变量。一般应用软件会自行一些信号,需要使用gdb屏蔽掉。方式,查看重定位项,你可以看到函数调用关系。注意:编码的时候尽量简洁,可以提升定位效率。场景一:只想获取指定任务的调用栈。优点:gdb原生功能,直接能使用。原创 2024-08-08 01:42:46 · 600 阅读 · 0 评论