gpt4 book ai didi

c - LD_PRELOAD 在我的代码中是如何工作的

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:13 26 4
gpt4 key购买 nike

<分区>

LD_PRELOAD 可用于在另一个共享对象之前链接一个共享对象。所以我尝试覆盖 glibc 中的 memcpy。

我定义了我的 memcpy,它将颠倒 src 的字节顺序并返回 NULL 以区别于 glibc 的 memcpy

我的内存.c

#include <string.h>

void *memcpy(void *dest, const void *src, size_t n) {
char *dest_c = dest;
const char *src_c = src;
size_t i = 0;

//reverse the byte order in src
for(i = 0; i < n; i++)
dest_c[i] = src_c[n-i-1];

return NULL;
}

测试.c

#include <stdio.h>
#include <string.h>

int main() {
char str[] = "hello";
char str2[100] = {};
char *ret;

//print the address of str2
printf("str2: %p\n", str2);

//print str2, address of memcpy, return value of memcpy
ret = memcpy(str2, str, 6);
printf("%s %p %p\n", str2, memcpy, ret);

//the same
ret = memcpy(str2, str, 3);
printf("%s %p %p\n", str2, memcpy, ret);

//the same
ret = memcpy(str2, str, 8);
printf("%s %p %p\n", str2, memcpy, ret);

return 0;
}

编译&运行:

$gcc -shared -o libmem.so mymem.c
$gcc test.c -o test
$export LD_PRELOAD="./libmem.so"
$./test

结果:

str2: 0x7fff0297e710
hello 0x400470 0x7fff0297e710
lehlo 0x400470 (nil)
0x400470 (nil)

当第三个参数等于 char 数组的大小时(在本例中,sizeof str 为 6),输出并不像我预期的那样。

第一次memcpy之后,我觉得str2[0]应该是'\0',所以str2是一个空串,但是输出的是“hello”。 memcpy的返回值应该是NULL,但是输出的是str2的地址。看起来 glic 的 memcpy 有效(我不确定)。

另外两个 memcpy 的工作符合我的预期。

我已经在 debian 8 和 ubuntu 14.04 上测试过了。

谁能解释一下?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com