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

赫弗顿·科尼安·德·弗雷塔斯

我在使用带有新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函数,但是在尝试调用函数本身之前遇到了错误。

洛林奇·西格蒙德

-编辑-

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

  1. 链接共享对象时,fpc-3.0.0(或更高版本)会将其添加到依赖项中(作为第一个依赖项): /lib64/ld-linux-x86-64.so.2

  2. ld-linux-x86-64.so.2导出一个calloc变体,该变体不会(总是)清除它返回的内存(详细信息如下)

建议的解决方法OP是在单独的过程中链接(使用的-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/此处:为什么在gdb中调用calloc似乎不会使内存清零?

建议的解决方案:根据示例更改链接:

- 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PHP中使用curl加载Spotify URL时出现问题

来自分类Dev

启用php7和php5时,apache出现问题

来自分类Dev

在iOS7中使用CGContext绘图时出现问题

来自分类Dev

在Angular7中使用Checkbox Ag-grids时,复选框出现问题

来自分类Dev

在WAMP中使用PHP 7

来自分类Dev

Intershop 7-在数据库中添加新索引时出现问题

来自分类Dev

将XML文件数据加载到PHP对象中时出现问题

来自分类Dev

PHP从数据库读取数据时出现问题

来自分类Dev

使用PHP将用户添加到数据库时出现问题

来自分类Dev

使用PHP进行基本数据库连接时出现问题

来自分类Dev

使用PHP将数据插入MYSQL数据库时出现问题

来自分类Dev

使用php将数据插入MySQL数据库时出现问题

来自分类Dev

使用PHP从MySQL数据库显示希腊文本时出现问题

来自分类Dev

PHP7的路由库

来自分类Dev

安装Nexus 7时出现问题

来自分类Dev

Windows 7中未加载PHP 7 FTP扩展

来自分类Dev

PHP 7中的同步块

来自分类Dev

PHP 7中的匿名类

来自分类Dev

使用 php 7 配置 MSSQL

来自分类Dev

如何使用PHP 7启用php扩展

来自分类Dev

在Java EE 7应用程序中使用ThreadPoolExecutor的Drools导致重新部署时出现问题

来自分类Dev

在PHP中创建多维数组时出现问题

来自分类Dev

在HTML中显示PHP代码时出现问题

来自分类Dev

使用mySQL和PHP登录时出现问题

来自分类Dev

使用MySQL和PHP创建表时出现问题

来自分类Dev

使用PHP和MySQLi插入数据时出现问题

来自分类Dev

使用PHP exec()获取更新信息时出现问题

来自分类Dev

使用php mail()发送.docx时出现问题

来自分类Dev

使用MySQL和PHP创建表时出现问题