Kann mit sudo nicht auf gemeinsam genutzte Bibliotheken zugreifen


8

Ich versuche, eine Demo zum Schreiben von PCM auf das I 2 S zu bringen. Ich habe ein kleines Demo-Programm erstellt, das beim Ausführen mit dem folgenden Befehl einen Fehler ausgibt./demo stereo_small.wav

can't open /dev/mem

Ich starte also mit diesem Befehl sudo ./demo stereo_small.wav (hinzugefügt sudo) und die Demo sollte nun erfolgreich mit erhöhten Berechtigungen ausgeführt werden können.

Aber ich bekomme jetzt diesen Fehler:

./demo: error while loading shared libraries: libsndfile.so.1: cannot open shared object file: No such file or directory

Um das Programm zum Laufen zu bringen, musste ich diesen Befehl zunächst ausführen export LD_LIBRARY_PATH=/usr/local/lib, damit er funktioniert, und jetzt ist der Fehler zurückgekehrt, aber nur, wenn ich dem Befehl das Präfix vorstellesudo

Bitte nackt mit mir Ich benutze C & Linux erst seit ein paar Stunden!

Folgendes habe ich getan, um zu kompilieren und auszuführen:

gcc `pkg-config --cflags sndfile` -c demo.c
gcc 'pkg-config --libs sndfile' demo.o -o demo
sudo ./demo stereo_small.wav

Update - Ursache: Einige Umgebungsvariablen werden im SU-Kontext nicht verwaltet (siehe hier)


1
Das linuxTag ist wahrscheinlich redundant. Es wäre besser, wenn Sie stattdessen Ihre Distribution bereitstellen würden (wahrscheinlich Debian).
Jivings

Bist du sicher, dass libsndfilees dort ist, wo du denkst? Überprüfen Sie dieses Verzeichnis. Überprüfen Sie auch die Ausgabe von echo $LD_LIBRARY_PATHÜbereinstimmungen.
Jivings

Womit versuchst du eigentlich zu tun /dev/mem?
Jivings

Ich versuche, auf die GPIO / I2S-Ausgänge zu schreiben! siehe hier: raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496
Dog Ears

Ich mag es, mich in die Tiefe zu werfen!
Hundeohren

Antworten:


3

Es ist ein kleiner Hack, bis ich herausgefunden habe, wie man richtig kompiliert und verknüpft oder die Anforderung für sudo aus dem 'fertigen' Code verschiebt. aber hier ist eine Option ...

Führen Sie die Shell unter sudo aus und fügen Sie die Umgebungsvariable set hinzu, bevor Sie das Programm ausführen:

sudo bash
export LD_LIBRARY_PATH=/usr/local/lib
./demo stereo_small.wav

Stattdessen sudo bashkönnen Sie die aktuelle Shell mit behalten sudo -s.
Jivings

0

Wenn Sie sustattdessen verwenden sudo, können Sie einen Befehl an die Root-Shell übergeben, damit dieser ausgeführt werden kann:

su --command="export LD_LIBRARY_PATH=/usr/local/lib && ./demo stereo_small.wav"

Das Problem bei der Verwendung sudobesteht darin, dass die Variable, die wir exportieren möchten, in der Root-Shell erhalten bleibt. Ich bin mir nicht sicher warum.


1
immer noch den Fehler beim Laden von gemeinsam genutzten Bibliotheken erhalten :(
Dog Ears

0

Es ist wahr, dass sudodie Umgebungsvariablen aus Sicherheitsgründen "gelöscht" werden (weiterführende Literatur hier ).

Wie in dieser großartigen Antwort vorgeschlagen , können Sie jedoch Umgebungsvariablen zusammen mit Ihrem Aufruf an übergeben sudo. In Ihrem Fall würde dies ungefähr so ​​aussehen:

sudo LD_LIBRARY_PATH=/usr/local/lib ./demo stereo_small.wav

Übergeben Sie also Ihre Umgebungsvariablen im Formular VAR=VALUE. Dies halte ich für besser, da es die Verwendung suund andere "hackige" Ansätze vermeidet .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.