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

时间:2017-03-12 05:52:00

标签: c assembly x86-64

我在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。

1 个答案:

答案 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()