我有一个问题,调用 malloc 时无法编译 strdup。
当我不调用 malloc 时,它会完美地编译我的共享库,所以如果有人可以帮助我,那就太好了!
这是我的代码:
BITS 64
DEFAULT REL
global my_strdup:function
extern malloc
my_strdup:
[...]
call malloc
我用这个编译:
$> nasm -f elf64 my_strdup.S
$> gcc -shared -o libmy.so my_strdup.o
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: my_strdup.o: 针对未定义符号 `malloc@@ 重定位 R_X86_64_PC32制作共享对象时不能使用GLIBC_2.2.5';使用 -fPIC 重新编译
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld:最终链接失败:错误值
collect2:错误:ld 返回 1 退出状态
我有这个错误。我不明白!我有一台 64 位计算机。
这是我第一次尝试组装。
Thanks !
对于第一个汇编程序来说,创建一个从另一个共享库调用函数的共享库可能不是最好的事情;)
也就是说,这就是纳斯姆手册 http://www.nasm.us/xdoc/2.11.08/html/nasmdoc7.html#section-7.9.3对此不得不说的是:
使用 wrt ..plt 引用过程名称会导致链接器
为符号建立一个过程链接表条目,并且
引用给出了PLT条目的地址。您只能在
通常会生成 PC 相对重定位的上下文(即
作为 CALL 或 JMP 的目标),因为 ELF 不包含重定位
键入绝对引用 PLT 条目。
所以,你需要的是call malloc wrt ..plt
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)