有没有办法在不加载的情况下读取.SO(共享对象)文件的内容?
我的用例场景是:
注意:我可以轻松地在DLL上执行这些操作.我也在Windows上工作,所以我无法加载.SO文件.
谢谢
我需要比较使用相同编译器/标志编译的2个可执行文件和/或共享对象,并验证它们没有更改.我们在受监管的环境中工作,因此对于测试目的而言,确切地隔离可执行文件的哪些部分已经发生变化非常有用.
由于包含有关文件信息的标头,因此使用MD5Sums/Hashes不起作用.
有没有人知道一个程序或方法来验证2个文件是否在执行上是相同的,即使它们是在不同的时间构建的?
我正在尝试运行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模块导致了什么?
我已将 .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 文件
考虑这种情况,其中可执行文件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
我正在使用多处理处理存储在字典中的大量数据.基本上我正在做的是加载一些签名,存储在字典中,从中构建一个共享的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) 假设我有:
/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或任何东西.我希望它在编译时链接到共享对象.
这甚至可能吗?
我有一个使用 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 文件
检查扩展名[![检查扩展名[5]](https://i.stack.imgur.com/rrEeC.png)
扩展名“example.so”不存在。
我正在使用 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) 我有以下共享对象:
我的库文件
#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++ 程序中导入共享对象,效果很好。知道出了什么问题吗?
shared-objects ×10
c++ ×2
python ×2
c ×1
comparison ×1
dictionary ×1
dll ×1
executable ×1
gcc ×1
ld ×1
linker ×1
locks ×1
perl ×1
permissions ×1
php ×1
pycharm ×1
python-3.x ×1
setuid ×1
swig ×1
unix ×1