Linux'taki mevcut rotayı incelemenin bir yolu var mı?


83

readelf -d <elf> | grep RPATHKabuktan belirli bir ikili dosyayı incelemenin mümkün olduğunun farkındayım , ancak bunu bir süreç içinde yapmak mümkün müdür?

Gibi bir şey (tamamen uydurma sistem çağrım):

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

Kod tabanımızda bazı şüpheli SO bağlantı sorunlarını teşhis etmeye çalışıyorum ve mümkünse RPATH'ı bu şekilde incelemek istiyorum (harici bir komut dosyası oluşturmak zorunda kalmamayı tercih ederim).


1
Paylaşılan kitaplık sorunlarını teşhis ederken, RUNPATH etiketini de incelemeniz gerektiğini unutmayın. Yani grep PATHbunun yerine yapmalısın . RPATH veya RUNPATH'ın kullanılıp kullanılmayacağı bağlayıcıya bağlıdır ve ikisi arasında ince ama önemli farklar vardır: stackoverflow.com/a/52020177
Nicolas Capens

Yanıtlar:


54

1
harika, ancak $ ORIGIN ile çalışmıyor. $ ORIGIN yorumlanmaz ve işlev tarafından olduğu gibi döndürülür. $ ORIGIN yorumunu eklemenin bir yolu var mı?
Jérôme

5
@ Jérôme /procMonte edilen bir ortamda çalıştırıyorsanız , genişletme işlemi son bölü çizgisinde NUL sonlandırması $ORIGINkadar basittir readlink("/proc/self/exe", ...).
Çalışan Rus

Soru özellikle ilgiliyken, bir ikilinin paylaşılan kitaplıklarını yüklediği yolları bilmek istiyorsa etiketi RPATHkontrol etmenin de aynı derecede önemli olduğunu belirtmek isterim DT_RUNPATH.
Nicolas Capens

155

Kayıt için, rpathbaşlığı gösterecek birkaç komut var .

objdump -x binary-or-library |grep RPATH

Belki bunu yapmanın daha da iyi bir yolu şudur:

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

İkinci komut ayrıca diğer kitaplıklara doğrudan bağımlılıkları da listeler rpath.


7
Ubuntu 15.04'te şunu kullanmalıyım: objdump -x binary-or-library | grep RUNPATH
Andreas Roth


11
Bu cevap vardır hiçbir şey istendi (ve soru ile ilgisi bulunan söz kendisinde).
çalışan Rus


1

Kabuk işlevi olarak kolaylık sağlamak için kullandığım şey:

function getrpath {
    eu-readelf -d "${1:?}" | sed -e '/RUNPATH/{s~.*\[\(.*\)\]~\1~;n};d'
}

Bu eu-readelf, aşağıdaki elfutilsgibi çıktıları tüketir :

Type              Value
NEEDED            Shared library: [libpq.so.5]
NEEDED            Shared library: [libc.so.6]
RUNPATH           Library runpath: [/some/path/to/lib]
....

ve yayar

 /some/path/to/lib

readelfElfutils yerine binutils ile de iyi çalışmalıdır eu-readelf.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.