gpt4 book ai didi

php - 在 PHP 7.4 中使用 FFI 加载库时出现问题

转载 作者:行者123 更新时间:2023-12-04 10:40:30 25 4
gpt4 key购买 nike

我在新的 FFI 中使用 PHP 中的第三方 .so 库时遇到问题。
当我运行这段代码时:

<?php

$ffi = FFI::cdef('typedef int (*NFE_Nome)(const char* sNome, int* esTamanho);', 'libacbrnfe64.so');

PHP 输出我这个错误:
double free or corruption (out)
Aborted (core dumped)

这是库本身的问题,我的PHP配置还是其他问题?这让我感到困惑,因为我通常可以在这个 C++ 代码中使用同一个库:
#include <iostream>
#include <dlfcn.h>

typedef int (*NFE_Nome)(const char* sNome, int* esTamanho);

#define BUFFER_LEN 256

int main() {
void *lib = dlopen("libacbrnfe64.so", RTLD_LAZY);

auto libMethod = (NFE_Nome) dlsym(lib, "NFE_Nome");

const std::string bufferNome(BUFFER_LEN, ' ');
int bufferNomeLength = BUFFER_LEN;

libMethod(bufferNome.c_str(), &bufferNomeLength);

std::cout << bufferNome << std::endl;
return 0;
}

我知道 PHP 代码不执行 NFE_Nome 函数,但是在尝试调用函数本身之前我收到了错误。

最佳答案

- 编辑 -

这个问题是两个不同程序中的两个错误的结果。

  • 链接共享对象时,fpc-3.0.0(或更新版本)将此添加到依赖项(作为第一个依赖项):/lib64/ld-linux-x86-64.so.2
  • ld-linux-x86-64.so.2 导出 calloc变体,它不会(总是)清除它返回的内存(详情如下)

  • OP 建议的解决方法是在单独的 channel 中链接(使用 -E (或 -Cn )选项 fpc ),但在运行 ./ppas.sh 之前固定 link.res文件。为此,我破解了这个 awk 脚本,但我确实觉得它有点笨拙:
    #!/usr/bin/awk -f
    $0=="INPUT(" { state=1; next; }
    $0=="/lib64/ld-linux-x86-64.so.2" { state=2; next; }
    $0==")" && state>0 { state=0;next; }
    state==1 { print "INPUT("; state=0; }
    { print $0; }

    ——原答案——

    听起来像是链接问题:您可能添加了 /lib64/ld-linux-x86-64.so.2到依赖的共享库中,这既不需要也没有用。

    实际上,结果是 calloc返回非零内存的版本。详情请见此处: https://www.linuxquestions.org/questions/programming-9/debugging-dlopen-4175668676/在这里: Why does calling calloc in gdb not appear to zero out the memory?

    建议的解决方案:根据示例更改联动:
    - gcc -shared -o demodule.so demodule.o /lib64/ld-linux-x86-64.so.2 -lglib-2.0
    + gcc -shared -o demodule.so demodule.o -lglib-2.0

    差异可以通过 readelf -d 检查.错误的:
    Dynamic section at offset 0x828 contains 26 entries:
    Tag Type Name/Value
    0x0000000000000001 (NEEDED) Shared library: [ld-linux-x86-64.so.2]
    0x0000000000000001 (NEEDED) Shared library: [libglib-2.0.so.0]
    0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

    右输出:
    Dynamic section at offset 0x7f8 contains 25 entries:
    Tag Type Name/Value
    0x0000000000000001 (NEEDED) Shared library: [libglib-2.0.so.0]
    0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

    另外,使用命令 ldd demodule.so包含 /lib64/ld-linux-x86-64.so.2 的行应该是最后一个。

    编辑:关于这个问题的关于 sourceware.org 的讨论:
    https://sourceware.org/bugzilla/show_bug.cgi?id=25486

    编辑:在 Freepascal 方面: https://bugs.freepascal.org/view.php?id=36706

    关于php - 在 PHP 7.4 中使用 FFI 加载库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59956996/

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