快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

巴黎人贵宾厅app:覆盖GNU C库中调试glibc函数



一种调试 glibc 函数的好措施是用您自己的版本覆盖所关注的函数。在没有 root 许可权和不必从新编译 libc 源代码的环境下就可以完成这个义务。想象一下编写您自己的 open() 版本该有多激动啊!

假如您没有利用法度榜样的源代码并且因为 C 的 GNU 库(glibc)函数正将某些差错信息返回给该利用法度榜样而使它掉败,那么您该怎么办? 由于 glibc 是开放源码,以是您当然可以得到其源代码、对它进行变动、从新构建和安装。 然而,这不得当那些恐惧的人,由于虽然 API 有很好的文档阐明,但 GNU C 库的内部组织却没有。 查找精确的函数原型只是浩繁寻衅中的第一个。 它照样一个很大年夜的包,以是第一次编译时,它将花一些光阴(glibc 2.2.2 有 8552 个文件和 1775440 行代码,包括注释)。

更好的措施

比从新构建 glibc 更好的措施是选择性地覆盖一个函数。许多今世的 Unix 都支持预装入用户定义库这一观点。巴黎人贵宾厅app 这些库可所以完备的替代(即,glibc 的专用版本)也可所以子集 — 以致是一个函数。 首先,经由过程设置 LD_LIBRARY_PATH 来包孕库的专用版本,您可以应用 g巴黎人贵宾厅applibc 的专用 版本。可经由过程应用 LD_PRELOAD 情况值来应用您编写的库例程的子集。LD_LIBRARY_PATH 和 LD_PRELOAD 都是由动态 ELF 链接器/装入器节制的。 它应用第一个匹配来满意任何符号名。经由过程预装入您自己的库或函数版本,您“短路”了正常路径,这样就容许您覆盖它。

这里是一个示例 makefile,它覆盖 glibc 函数 setresgid():巴黎人贵宾厅app

覆盖 setresgid() 的 Makefile

#

# Makefile

#

all: libs setresgid-tester

#

# Make a shared Library

#

libs: libfuncs.c

gcc -shared -Wl,-soname,libfuncs.so.1 -o libfuncs.so.1.0 libfuncs.c

ln -s libfuncs.so.1.0 libfuncs.so.1

ln -s libfuncs.so.1 libfuncs.so

#

# Here is a program that calls setresgid() for testing

#

setresgid-tester: setresgid-tester.c

gcc -o setresgid-tester setresgid-tester.c

文件 libfuncs.c 包孕我的 setresgid() 专用版本。 实现它以支持与原始 setresgid() 相同的参数数目时要小心,并在其它方面完成与原始 setresgid() 相同的操作,只管我的版本诈骗该利用法度榜样并始终返回 0。

关注的第二个文件是 setresgid-tester.c。它经由过程调用 setresgid() 试验新函数。

这是动态库的源代码:

调换库

/*

Put all the functions you want to override here

*/

#include

#include

#include

int errno;

int

setresgid(rgid, egid, sgid)

gid_t rgid,egid,sgid;

{

errno=1;

printf("It me the shim, Hi there!

");

return(0);

}

您还必要一个简单措施来测试您的 setresgid() 专用版本。可以应用 strace 或 ltrace 来监视进程运行。这是通俗测试示例的源代码:

通俗测试示例

/*

setresgid() system/library call tester

*/

#include

#include

main(){

setresgid(0,0,0);

}

现在,编译该库,设置 LD_PRELOAD shell 变量,然后运行测试利用法度榜样。您可能还必要设置 LD_LIBRARY_PATH。

运行测试利用法度榜样

eXPort LD_PRELOAD=libfuncs.so

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

./setresgid-test巴黎人贵宾厅apper

It's me the shim, Hi there!

还可以经由过程应用 ldd 列出动态链接库来确认是否正在应用专用库:

确认专用库的应用

[jay@prion ld_preload]$ ldd setresgid-tester

libfuncs.so => libfuncs.so (0x40018000)

libc.so.6 => /lib/libc.so.6 巴黎人贵宾厅app(0x40022000)

/lib/ld-Linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

停止语

编写 GNU C 库函数的专用版本是调试系统问题或进行快速修正的好措施。 应用 LD_PRELOAD shell 变量,可以选择性地用您自己的专用版原先覆盖系 统 C 库函数。这种技巧可用于 linux 和 Solaris 情况。

关于作者

Jay Allen 是 IBM linux for Service Providers Lab(LSPL)的法度榜样员。可以经由过程 jaydallen@us.ibm.com 与 Jay 联系。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: