使用 LD_PRELOAD 加载共享库时出现问题

问题描述 投票:0回答:1

我有一个遗留系统,可以在以前的系统上运行,但无法使其运行。

系统: 我有一张华硕 Xonar 7,1 声卡。我之前在 Linux 上运行过 Spotify。我之前运行的是 7.1 卡,所有通道都连接到 8 通道放大器。 我将 .asoundrc 与代表每组扬声器的多个 pcm 设备一起使用,即

pcm.study {
    type route
    slave {
        pcm "hw:0,0"
        channels 8
    }
    ttable {
        0.2= 1
        1.3= 1
    }
}

每个房间都重复此操作。 Linux 的原始 Spotify 不允许我选择音频设备,因此我编写了一个共享库,该库拦截 snd_pcm_open 并根据文件中的值修改设备名称,然后使用

dlsym(RTLD_NEXT, "snd_pcm_open")

打开所需的设备。我有一个单独的守护进程来设置此文件中的值。

不再支持 Linux 的原始 Spotify,因此我在安装 debian 12 后尝试了 snap 包,并设法使用 aplay -D 研究让单独的 pcm 设备通过所需的输出播放。

我编写了一个应用程序,可以在默认的 alsa 设备上播放波形文件,并使用 LD_PRELOAD 来预加载我的库,它工作正常。

对于所有其他应用程序,我遇到了各种不同的问题。 对于 Spotify(快速安装)和其他一些使用 librespot 的应用程序,我得到了

ld.so: object 'alsaselect.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.

我已经尝试了库的完整路径和库名称。 我在负载上使用了 LD_DEBUG 和 strace,但看不出它失败的原因。

使用 vlc 我可以加载库,但是当我拦截 snd_pcm_open 时,函数 dlsym(RTLD_NEXT, "snd_pcm_open") 返回 NULL

vlc 可以从它的设备选择菜单中播放 pcm 设备。

我不确定是否继续走这条路。 还有其他方法可以实现这一目标吗?我最初实现这一点时遇到了很少的麻烦,但不确定操作系统中的某些内容是否已更改(我认为原始版本将小于 debian 8)

spotify alsa ld-preload
1个回答
0
投票

好的,通过不同的路径解决了这个问题。

LD_PRELOAD 失败的原因似乎是新的 Spotify 应用程序是一个 snap 应用程序,并且容器系统似乎正在停止预加载。同样,我尝试过的另一个应用程序https://github.com/xou816/spot作为 flatpak 分发也有同样的问题。

不太了解导致加载失败的原因,因为我假设它可能加载但无法工作,但我可以忽略这一点。

通过克隆现货存储库并编译它来解决这个问题,这样我就可以将它作为本地应用程序运行。我原来的 LD_PRELOAD 现在加载并像以前一样工作。

© www.soinside.com 2019 - 2024. All rights reserved.