gpt4 book ai didi

无法在 C 程序中预加载函数

转载 作者:行者123 更新时间:2023-12-01 12:22:33 25 4
gpt4 key购买 nike

我在 nasm 中编写了一些代码,我试图在 C 程序中实现它以通过共享库替换 strlen,但它不起作用。

nasm 代码:​​

        section .text  
global strlen:function

strlen:
mov rax, 42
ret

C 代码:

#include <stdio.h>

size_t strlen(const char *s);

int main()
{
printf("%zu\n", strlen("foobar"));
return (0);
}

我只使用不带任何参数的 gcc 编译 C 程序,并使用以下命令创建共享库:

nasm -f elf64 strlen.asm
gcc -shared -fPIC -o libasm.so strlen.o

最后,我包含了共享库:

export LD_PRELOAD=`pwd`/libasm.so

但它在我希望显示“42”的地方显示“6”。我不认为问题出在我的库中,因为当我使用 LD_PRELOAD 执行 ls 命令时出现段错误。

我正在使用 Ubuntu 16.04。

最佳答案

这与 nasm 完全无关。与 strlen() 函数等效的 C 也不起作用。

$ cat strlen.c 
#include <stddef.h>

size_t strlen(const char *s)
{
return 43;
}

$ cat s.c
#include <stdio.h>

size_t strlen(const char *s);

int main()
{
printf("%zu\n", strlen("foobar"));

return 0;
}

$ make s
cc s.c -o s

$ gcc -shared -fPIC -o strlen.so strlen.c

$ LD_PRELOAD=$PWD/strlen.so ./s
6

这里发生的事情是 gcc 正在使用它自己的无法覆盖的 strlen() 内置版本。如果调用 strlen()C 程序被重新编译为不使用此内置版本的 strlen(),则您的共享库可以覆盖它。

$ rm s
$ make s CFLAGS=-fno-builtin-strlen
cc -fno-builtin-strlen s.c -o s

$ LD_PRELOAD=$PWD/strlen.so ./s
43

$ LD_PRELOAD=$PWD/libasm.so ./s
42

关于无法在 C 程序中预加载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42744249/

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