- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在从事一个项目,该项目需要将基于 Rust 的插件(共享对象)任意加载/卸载到隔离的动态库命名空间中。
我使用 dlmopen(LM_ID_NEWLM, "rust-plugin.so", RTLD_LAZY)
为共享对象创建新的命名空间。当不再需要共享对象时,我调用 dlclose()
。
不幸的是,我发现即使我 dlclose()
一次只有一个共享对象有效,在 dlmopen()
ing 14 Rust 插件之后对象,我得到错误:
dlmopen(rust-plugin.so) failed: /lib/x86_64-linux-gnu/libc.so.6: cannot allocate memory in static TLS block
在此失败后继续尝试 dlmopen()
会导致段错误,并且 dlmopen() 不再有可用的命名空间
。
我似乎已将问题隔离到 Rust 共享对象的 libpthread.so
依赖项。其他共享对象依赖项,如 libgcc_s.so.1
(以及我尝试过的任何 .so 文件)可以通过以下代码无限期地打开和关闭,而 libpthread.so
打开和关闭它 14 次后出错。
#include <link.h>
#include <stdio.h>
#include <dlfcn.h>
#include <cstdlib>
void load(char const *file) {
void *handle_ = dlmopen(LM_ID_NEWLM, file, RTLD_LAZY);
if (!handle_) {
printf("dlmopen(%s) failed: %s\n", file, dlerror());
exit(1);
}
if (dlclose(handle_) != 0) {
exit(2);
}
}
int main() {
void *handle_;
for (int i = 0; true; i++) {
printf("%d\n", i);
load("libpthread.so.0");
}
}
有什么方法可以让 libpthread 正确清理,从而避免这个问题?
最佳答案
libpthread.so.0
有NODELETE
标志:
readelf -d /lib/x86_64-linux-gnu/libpthread.so.0 | grep NODELETE
0x000000006ffffffb (FLAGS_1) Flags: NODELETE INITFIRST
这使得 dlclose()
禁止操作。另见 answer .
鉴于dlclose()
是空操作,其他一切都有意义:GLIBC 配置了 16 个加载程序命名空间,其中一个是为主应用程序保留的。一旦您调用 dlmopen
(不调用 dlclose
)15 次,你用尽了它们,随后的尝试失败了 no more namespaces available
.
标记 libpthread
与 NODELETE
有道理:一旦它出现在图片中,它就会从根本上改变 GLIBC 操作(例如 malloc
开始获取锁,errno
切换到线程本地,等等)。
Is there some way I can have libpthread properly clean up so I can avoid this issue?
我相信对你来说唯一现实的选择是尽量避免依赖 libpthread
从你的插件。
您可以做的其他事情:
libpthread
来自非默认加载器范围是;也许它应该是可卸载的,-z,nodelete
链接器标志,并为此安排 libpthread.so.0
作为插件依赖项加载(确保此版本与系统版本保持同步,否则您将很难调试崩溃)。关于c++ - libpthread.so 在 `dlclose()` 之后继续使用 TLS 空间和 DL 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44446683/
所以我有一个类似这样的 dl 列表: .title { display: inline-block; padding-bottom: 20px; } dd { -moz-margin-st
我想使用代理并运行它youtube-dl --proxy socks5://127.0.0.1:1080 这是下面的错误 Usage: youtube-dl [OPTIONS] URL [URL...
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
[Windows 10] 我有一个包含 128 个项目的视频播放列表 URL,我已经从同一个播放列表 URL 下载了 25 个视频。现在我想从 26 索引开始下载剩余的视频,但我无法使用 --paly
我正在使用 youtube-dl 从 youtube 下载播放列表。我使用自动编号功能对视频进行编号,这可以通过格式化输出文件的名称来实现,如下 -o "%(autonumber)s-%(title)
我正在显示 的列表tags 我页面中的标签。我想要 当标签的内容足够长以超出 的高度时不换行. 什么 css 可以防止这种情况发生? 最佳答案 我会使用 margin-left在 上等于 的宽
此命令下载视频并将自动生成的 youtube 字幕嵌入到文件中 youtube-dl.exe -ci -f "bestvideo[ext=mp4]"+"bestaudio[ext=m4a]" --wr
我在fedora 116上使用gcc/g++,我的想法是: c program -> load c++ dynamic library A -> load c++ dynamic library B
嗯,我可以在终端中使用它直接获取视频格式 - $ youtube-dl -F "some youtube url" 输出: [youtube] Setting language [youtube] P
我的 youtube-dl 库 ( https://rg3.github.io/youtube-dl/ ) 有问题。我使用 youtube-dl 不是通过这个库直接下载视频,而是我首先使用这样的命令生
关闭。这个问题需要details or clarity .它目前不接受答案。 想要改进这个问题吗? 通过 editing this post 添加详细信息并澄清问题. 关闭 8 年前。 Improve
我是 Android Studio 的新手,每次我尝试将项目与 gradle 同步时都会收到此错误。例如,我提供了对三个文件的引用。 1)项目级build.gradle文件 plugins {
更新 Gradle 后出现以下问题。我找不到任何解决方案。所以请帮我解决以下问题。提前致谢... (问题 ----- 无法获取“https://dl.google.com/dl/android/mav
我最近开始使用 react native,但是根据伊朗人的制裁,gradle 不能构建我的第一个项目,所以我使用了 VPN 和 shecan service但我收到以下错误: 我阅读了 React n
在Firebase身份验证(助手)中使用将Firebase身份验证添加到您的应用程序时出错。 该错误在“同步”标签中显示为: Could not GET 'https://dl.google.com/
我无法在 Android Studio 中构建项目,并且收到以下错误。 Gradle 同步失败。 无法获取“https://dl.google.com/dl/android/maven2/com/an
我正在尝试将 youtube 视频保存为我的下载文件夹中的 MP3。但是,这最终会将文件保存在与 youtube-dl 相同的目录中。 youtube-dl --extract-audio --aud
我正在使用 youtube-dl用于从 YouTube 下载视频。但是在我的办公室,互联网会每隔 20Mb 断开一次。的下载。 [错误:连接被远程服务器强行关闭]。 我必须再次输入 URL 才能继续下
好的,我知道要在您使用的python程序中从Youtube-DL获取Mp3文件 from __future__ import unicode_literals import youtube_dl yd
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!