我在nasm中编写了一些代码,我试图在C程序中实现它,作为通过共享库替换strlen,但它不起作用。
nasm code:
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
但它显示了&#39; 6&#39;我期望它显示在哪里&#39; 42&#39; 我不认为问题来自我的库,因为当我用LD_PRELOAD执行ls命令时出现分段错误。
我正在使用Ubuntu 16.04。
答案 0 :(得分:4)
这与nasm
完全无关。 C
等效的strlen()
功能也不起作用。
$ 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()
内置版本。如果重新编译调用C
的{{1}}程序而不使用此内置版本的strlen()
,那么您的共享库可以覆盖它。
strlen()