【问题标题】:Assembly coding strdup. Malloc calling in shared library汇编编码 strdup。共享库中的 malloc 调用
【发布时间】:2015-04-26 06:24:31
【问题描述】:

我有一个问题,我在调用 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: 针对未定义符号重定位 R_X86_64_PC32 ` malloc@@GLIBC_2.2.5' 制作共享对象时不能使用;使用 -fPIC 重新编译 /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld:最终链接失败:值错误 collect2:错误:ld 返回 1 个退出状态

我有这个错误。我不明白!我有一台64位的电脑。 这是我第一次尝试组装。

谢谢!

【问题讨论】:

    标签: assembly shared-libraries nasm x86-64


    【解决方案1】:

    创建一个从另一个共享库调用函数的共享库对于第一个汇编程序来说可能不是最好的选择;)

    也就是说,nasm manual 对此的看法如下:

    使用 wrt ..plt 引用过程名称会导致链接器 为符号建立一个过程链接表条目,并且 参考给出了 PLT 条目的地址。您只能在 通常会生成相对于 PC 的重定位的上下文(即 作为 CALL 或 JMP 的目的地),因为 ELF 不包含重定位 键入以绝对引用 PLT 条目。

    所以,你需要的是call malloc wrt ..plt

    【讨论】:

    • 非常感谢!!完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多