Frage

Ich bin mir bewusst, dass es möglich ist, readelf -d <elf> | grep RPATH zu verwenden, um ein bestimmte binären aus der Schale zu inspizieren, aber ist es möglich, dies in einem Prozess zu tun?

So etwas wie (mein ganz aus Systemaufruf):

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);

Ich versuche, einige verdächtige SO Verknüpfung Probleme in unserer Code-Basis zu diagnostizieren, und möchte die RPATH auf diese Weise, wenn möglich, überprüfen (ich würde lieber nicht ein externes Skript zum Laichen haben).

War es hilfreich?

Lösung

#include <stdio.h>
#include <elf.h>
#include <link.h>

int main()
{
  const ElfW(Dyn) *dyn = _DYNAMIC;
  const ElfW(Dyn) *rpath = NULL;
  const char *strtab = NULL;
  for (; dyn->d_tag != DT_NULL; ++dyn) {
    if (dyn->d_tag == DT_RPATH) {
      rpath = dyn;
    } else if (dyn->d_tag == DT_STRTAB) {
      strtab = (const char *)dyn->d_un.d_val;
    }
  }

  if (strtab != NULL && rpath != NULL) {
    printf("RPATH: %s\n", strtab + rpath->d_un.d_val);
  }
  return 0;
}

Andere Tipps

Für die Aufzeichnung sind hier ein paar Befehle, die die rpath Header zeigen wird.

objdump -x binary-or-library |grep RPATH

Vielleicht ein noch besserer Weg, es zu tun, ist die folgende:

readelf -d binary-or-library |head -20

Der zweite Befehl listet auch die direkten Abhängigkeiten von anderen Bibliotheken, die von rpath gefolgt.

Sie können auch verwendet werden:

chrpath -l binary-or-library
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top