glibc的变化不起作用

glibc的变化不起作用,c,linux,gcc,x86,C,Linux,Gcc,X86,我已经下载了glibc,这样我可以修改它的代码,然后使用它。因此,为了玩它,我更改了glibc目录stdiocommon中的printf函数,以便它打印“你能看到我吗?” 在做了那个更改之后,我编译了glibc,然后在这个glibc目录中使用LD_预加载libc.so来运行一个使用printf的示例程序。但是,我仍然看到printf打印正常,也就是说,我所做的更改没有反映出来。我在这里犯了什么错误?可能有几个原因,最简单的原因是您使用了没有实际格式的字符串,编译器将调用从printf更改为put

我已经下载了glibc,这样我可以修改它的代码,然后使用它。因此,为了玩它,我更改了glibc目录stdiocommon中的printf函数,以便它打印“你能看到我吗?”


在做了那个更改之后,我编译了glibc,然后在这个glibc目录中使用LD_预加载libc.so来运行一个使用printf的示例程序。但是,我仍然看到printf打印正常,也就是说,我所做的更改没有反映出来。我在这里犯了什么错误?

可能有几个原因,最简单的原因是您使用了没有实际格式的字符串,编译器将调用从
printf
更改为
put

printf("hello\n");
// becomes:
puts("hello");
尝试添加一个参数:

char ex = '!';
printf("Hello %c\n", ex);

把那重复的行改成只打印“hello”之类的。您正在处理两次va_列表,但这不起作用-第一次调用会耗尽它。我之前做了一些其他更改,将字符+1打印出来,而不是字符,这也不起作用!
ldd./testprogram
说了什么?此外,在运行程序之前执行导出LD_DEBUG=files可能会为您提供有用的信息。但是,在运行文件时会指定LD_PRELOAD,即覆盖程序使用的so文件,对吗?那么ldd在这方面有什么帮助呢?似乎LD_PRELOAD在这里不起作用?@metallicprade:我不知道
LD_PRELOAD
会如何影响
ldd
-我从未使用过
LD_PRELOAD
。仍然不起作用,用objdump检查代码,它确实在使用printf,而不是puts@迈克尔-我不知道。谢谢IIRC printf(“%s”,“hello\n”)也在内部转换为put(“hello\n”)。这有点难理解,因为glibc printf()非常友好,它会检查NULL并打印出适当的内容,而put()则不会,也会出错。
char ex = '!';
printf("Hello %c\n", ex);