标签: shared-objects

有没有办法在不加载的情况下读取.so文件的内容?

有没有办法在不加载的情况下读取.SO(共享对象)文件的内容?

我的用例场景是:

  1. 我在Windows上有一个.so文件.我需要查询一些方法,无论它们是否存在于.so中.
  2. 要了解.so文件中的所有类.
  3. 给定一个类名需要找到这个类的所有方法.

注意:我可以轻松地在DLL上执行这些操作.我也在Windows上工作,所以我无法加载.SO文件.

谢谢

c++ shared-libraries shared-objects

10
推荐指数
2
解决办法
3万
查看次数

比较生成的可执行文件以获得等效性

我需要比较使用相同编译器/标志编译的2个可执行文件和/或共享对象,并验证它们没有更改.我们在受监管的环境中工作,因此对于测试目的而言,确切地隔离可执行文件的哪些部分已经发生变化非常有用.

由于包含有关文件信息的标头,因此使用MD5Sums/Hashes不起作用.

有没有人知道一个程序或方法来验证2个文件是否在执行上是相同的,即使它们是在不同的时间构建的?

comparison executable shared-objects binary-reproducibility

8
推荐指数
2
解决办法
5348
查看次数

如何确定Perl模块导致的"未定义符号:Perl_Tstack_sp_ptr?"

我正在尝试运行Perl脚本,但它正在返回:

/ usr/bin/perl:符号查找错误:/usr/local/groundwork/perl/lib/5.8.8/x86_64-linux-thread-multi/auto/IO/IO.so:undefined symbol:Perl_Tstack_sp_ptr

有没有办法确定Perl模块导致了什么?

perl shared-objects

8
推荐指数
1
解决办法
3万
查看次数

为什么 Pycharm IDE 对从 .pyx 文件创建的共享对象“.so”文件显示“未解析的引用”?

我已将 .pyx 文件构建到 .so 文件中,当我尝试访问 .so 文件内的函数时,PyCharm IDE 始终显示“未解析的引用”和“找不到模块”错误。我应该如何将 .so 文件导入到 python 中?使用“setup.py”文件将 .pyx 文件构建为 .so 文件后,我应该如何将它们导入 python 中?我应该定义这些文件的路径吗?

在浏览了有关此主题的一些帖子后,我尝试1)将这些.so文件的目录添加到PYTHONPATH中2)在Pycharm项目解释器中添加LD_LIBRARY_PATH环境变量3)在终端中运行ldconfig -n path_to_the_files

这些都不起作用,我的 IDE 仍然检测不到 .so 文件

shared-objects pycharm

8
推荐指数
0
解决办法
310
查看次数

将setuid位置1后,程序无法加载

考虑这种情况,其中可执行文件A.bin使用libY.so和libZ.so. Ac,Yc和Zc都是用CZc编写的,Yc编译成各自的.so文件.

这是文件的目录结构

$ home/bin/A.bin $ home/lib/libY.so $ home/lib/libZ.so

当我以普通用户身份运行A.bin时,A.bin按预期正常运行.注意:$ LD_LIBRARY_PATH包含$ home/lib

我在Ac中更改了一些代码,添加了一些需要管理员权限的功能(比如绑定到小于1000的端口).我将A.bin,libY.so和libZ.so的setuid位设置为rwsrwsrws,并将文件的所有权更改为root.当我尝试运行A.bin时,我收到以下错误

ld.so.1:A.bin:致命:libY.so:打开失败:没有这样的文件或目录被杀死

当我刚从所有这些文件中删除setuid权限时,除了功能失败之外,二进制运行它需要root权限.

如何克服这个问题?

编辑:操作系统是Solaris 5.10

c unix permissions setuid shared-objects

7
推荐指数
1
解决办法
5386
查看次数

python:使用多处理共享巨大的词典

我正在使用多处理处理存储在字典中的大量数据.基本上我正在做的是加载一些签名,存储在字典中,从中构建一个共享的dict对象(获取Manager.dict()返回的'proxy'对象)并将此代理作为参数传递给具有该函数的函数在多处理中执行.

只是为了澄清:

signatures = dict()
load_signatures(signatures)
[...]
manager = Manager()
signaturesProxy = manager.dict(signatures)
[...]
result = pool.map ( myfunction , [ signaturesProxy ]*NUM_CORES )
Run Code Online (Sandbox Code Playgroud)

现在,如果签名少于200万个条目,那么一切都很完美.无论如何,我必须使用5.8M密钥处理字典(二进制格式的酸洗签名生成4.8 GB文件).在这种情况下,进程在创建代理对象期间死亡:

Traceback (most recent call last):
  File "matrix.py", line 617, in <module>
signaturesProxy = manager.dict(signatures)
  File "/usr/lib/python2.6/multiprocessing/managers.py", line 634, in temp
token, exp = self._create(typeid, *args, **kwds)
  File "/usr/lib/python2.6/multiprocessing/managers.py", line 534, in _create
id, exposed = dispatch(conn, None, 'create', (typeid,)+args, kwds)
  File "/usr/lib/python2.6/multiprocessing/managers.py", line 79, in dispatch
raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError: …
Run Code Online (Sandbox Code Playgroud)

python dictionary shared-objects multiprocessing

7
推荐指数
2
解决办法
4618
查看次数

GCC链接到共享对象的链接器名称

假设我有:

  • /usr/lib/libsomething.so.1 在机器A上;
  • /usr/lib/libsomething.so.2 在机器B.

两台机器都有/usr/lib/libsomething.so符号链接到各自的库.

如果我使用链接gcc-lsomething(甚至/usr/lib/libsomething.so),它会跟随符号链接,和ldd机器上的产生是这样的:

libsomething.so.1 => /usr/lib/libsomething.so.1
Run Code Online (Sandbox Code Playgroud)

这意味着它将无法在机器B上找到库.

现在我知道这些是主要的版本号更改,我知道它们可能不兼容,但我愿意冒这个风险.我想告诉链接器要查找libsomething.so,不要按照符号链接ldd显示

libsomething.so => /usr/lib/libsomething.so.1
Run Code Online (Sandbox Code Playgroud)

在A但是

libsomething.so => /usr/lib/libsomething.so.2
Run Code Online (Sandbox Code Playgroud)

在B.然后加载器将遵循符号链接到任何版本.

此外,我不希望延迟加载dlopen或任何东西.我希望它在编译时链接到共享对象.

这甚至可能吗?

linker gcc ld shared-objects

7
推荐指数
1
解决办法
4196
查看次数

添加 .so 作为 php 扩展名

我有一个使用 SWIG 生成的 .so 文件。我想使用那里定义的函数作为 php 扩展。如何将它们添加为 php 扩展?

我将.so添加到扩展目录中,并在php.ini中添加一行:“extension=example.so”,然后重新启动apache。

不过,当我运行:时php -d "extension=example.so" -m,它不会显示为扩展名,并显示: "Unable to load dynamic library '/usr/lib/php5/...../example.so. cannot open shared object file: Permission denied in Unknown on line 0"

然而,权限是 777

权限

权限

PHP .so 文件夹

扩展文件夹

php.ini 文件

php.ini 文件 在此输入图像描述

检查扩展名[检查扩展名[5]

扩展名“example.so”不存在。

php dll swig shared-objects php-extension

7
推荐指数
1
解决办法
9962
查看次数

为什么Python会为共享锁抛出“multiprocessing.managers.RemoteError”?

我正在使用 python 3.6.7 和 Ubuntu 18.04

运行以下脚本后,每个进程都有自己的共享锁:

from multiprocessing import Process, Manager


def foo(l1):
    with l1:
        print('lol')


if __name__ == '__main__':
    processes = []
    with Manager() as manager:
        for cluster in range(10):
            lock1 = manager.Lock()
            calc_args = (lock1, )
            processes.append(Process(target=foo,
                                     args=calc_args))
        for p in processes:
            p.start()

        for p in processes:
            p.join()

Run Code Online (Sandbox Code Playgroud)

我有一个奇怪的例外:

Process Process-2:
Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "temp.py", line 5, in foo …
Run Code Online (Sandbox Code Playgroud)

shared-objects locks python-3.x python-multiprocessing

7
推荐指数
1
解决办法
3556
查看次数

在 Python 中导入 C++ 共享对象时出现分段错误

我有以下共享对象:

我的库文件

#include <iostream>

class MyClass
{
 public:
 MyClass(){}

 void function()
 {
  std::cout << "hello" << std::endl;
  //var = 10;
 }

 private:

 int var;

};



extern "C" {
 MyClass* create()
 {
  return new MyClass();
 }


 void func(MyClass* myclass)
 {
  myclass->function();
 }

}
Run Code Online (Sandbox Code Playgroud)

我编译的: g++ -fPIC -shared -o MyLib.so MyLib.cpp

然后我将它与以下 Python 脚本一起使用:

脚本文件

import ctypes

lib = ctypes.cdll.LoadLibrary("./MyLib.so")

MyClass = lib.create()
lib.func(MyClass)
Run Code Online (Sandbox Code Playgroud)

像这样,它工作得很好,但是如果我取消注释该行//var = 10;,Python 会导致分段错误(Python 3.8)。每次对象MyClass对其局部变量之一进行更改时都会发生这种情况(构造函数内部除外,它在那里工作)。貌似变量地址var不对,访问时出现段错误。我尝试在function没有任何更改的情况下使用关键字“virtual” ,并尝试使用 dlfcn 在另一个 C++ 程序中导入共享对象,效果很好。知道出了什么问题吗?

c++ python shared-objects

7
推荐指数
1
解决办法
217
查看次数