Binary'nin Hangi .so'dan Hangi Fonksiyonu Import Ettiğini Gösteren Araçlar

Mergen

Yönetici Penguen
Katılım
10 Temmuz 2026
Mesajlar
23
Konum
İzmir
İşletim Sistemi
Pardus
Windows'taki Dependency Walker tarzı bir araç arıyorsanız Linux'ta maalesef bire bir aynısı yok ama istenen bilgiyi elde etmenin birkaç yolu var. ldd ve objdump -T'yi zaten biliyorsun, onların eksik kısmı: hangi sembolün hangi kütüphaneden geldiğini göstermemesi. Bunun sebebi ELF formatında sembolün hangi .so'dan import edildiği bilgisinin doğrudan tek bir tabloda tutulmaması. Aslında bu bilgi dinamik bağlayıcı tarafından çalışma zamanında çözülüyor. Statik olarak sembolü kütüphaneye eşlemenin en sağlam yolu ELF'in versiyonlama bilgilerini kullanmak.

1. objdump -T ile versiyon bilgisi
objdump -T çıktısına baktığında sembolün isminin yanında bir @GLIBC_2.2.5 gibi bir sürüm etiketi görürsün. Bu sürüm etiketi, sembolün hangi kütüphane ailesine ait olduğunu gösterir. Örneğin GLIBC_2.2.5 libc.so.6'ya, LIBUSB_1.0 ise libusb-1.0.so.0'a aittir. Ama bu etiketleri kütüphane dosya adına çevirmek için ldconfig -p çıktısına ya da kütüphanelerin .gnu.version_r bilgisine bakmak gerekir.

2. readelf -V ile versiyon ihtiyaçlarını görmek
Binary'nin hangi versiyonları hangi kütüphanelerden beklediğini görmek için:
Kod:
readelf -V /path/to/binary
Bu çıktı, Version needs section altında kütüphane isimleriyle birlikte gerekli sembol versiyonlarını listeler. Örneğin:
Kod:
 0x0010: Version: 1  File: libc.so.6  Cnt: 4
  0x0020:   libc.so.6 0x0b  version 3  GLIBC_2.2.5
  0x0030:   libc.so.6 0x0d  version 4  GLIBC_2.3.4
Buradan hangi versiyonun hangi kütüphaneye ait olduğunu görebilirsin. Sonra objdump -T'den elde ettiğin sembol+versiyon çiftini bu tabloyla eşleştirince hangi sembolün hangi .so'dan geldiğini bulabilirsin.

3. Otomatikleştiren bir script
Bu işi elle yapmak can sıkıcı olabilir. Aşağıdaki bash scripti, verdiğin bir ELF dosyası için import edilen her sembolü, hangi .so'dan geldiğiyle birlikte listeler. Script, readelf -V ve objdump -T çıktılarını birleştiriyor:

Kod:
#!/bin/bash
# usage: ./depanalyzer.sh /path/to/binary
binary=$1
if [[ -z $binary ]]; then
  echo "Usage: $0 <elf-file>"
  exit 1
fi

# Geçici dosyalar
tmp_sym=$(mktemp)
tmp_ver=$(mktemp)

# objdump -T: sembol ve versiyon listesi
objdump -T "$binary" 2>/dev/null | grep -E '^[0-9a-f]+' | awk '{print $NF}' | grep '@' | sed 's/.*@/@/' | sort -u > "$tmp_sym"

# readelf -V: versiyon -> kütüphane eşlemesi
readelf -V "$binary" 2>/dev/null | awk '/File: /{lib=$NF} /version [0-9]+/{ver=$NF; if(lib != "") print ver, lib}' | sort -u > "$tmp_ver"

# Birleştir: her sembol için versiyonu al, kütüphaneyi bul
while IFS= read -r sym; do
  ver=$(echo "$sym" | sed 's/.*@//')
  lib=$(grep -m1 "$ver$" "$tmp_ver" | awk '{print $2}')
  if [[ -n $lib ]]; then
    echo "$sym  ->  $lib"
  else
    echo "$sym  ->  (unknown library)"
  fi
done < "$tmp_sym"

rm -f "$tmp_sym" "$tmp_ver"

Bu scriptin bir sınırlaması: versiyon etiketi olmayan semboller (örneğin strlen@GLIBC_2.2.5 yerine sadece strlen@@GLIBC_2.2.5 olabilir, onu da ayıklamak gerek). Ayrıca bazı kütüphaneler versiyon bilgisi vermeyebilir. Yine de çoğu GNU/Linux sisteminde iş görür.

4. Alternatif: readelf -r ile relokasyonları incelemek
Daha düşük seviyede, hangi sembolün hangi relokasyonla hangi kütüphaneye bağlandığını görmek istersen readelf -r kullanabilirsin. Bu çıktıda sembol indeksi ve ofset vardır, ama kütüphane adı doğrudan yoktur. Sembol indeksini .dynsym tablosuyla eşleştirip, ardından versiyon bilgisiyle kütüphaneyi bulman gerekir. Bu daha karmaşık.

5. GUI olarak: Ghidra veya IDA
Eğer görsel bir araç arıyorsan, Ghidra'nın import penceresi (veya IDA'nın imports view) tam olarak istediğini verir: hangi fonksiyonun hangi kütüphaneden alındığını listeler. Ghidra ücretsiz ve açık kaynak, Linux'ta çalışır.

Ben şahsen Ghidra'yı tercih ediyorum, çünkü recursive dependency ağacını da gösteriyor ve sembol isimlerine tıklayarak kaynak koda gidebiliyorsun. Ama komut satırından hızlı bir bakış için yukarıdaki script iş görür.

lddtree'nin -u seçeneği unresolved sembolleri gösterir ama kütüphane başına sembol listesi vermez. pax-utils içindeki scanelf da sembol taraması yapabilir ama yine gruplama yapmaz.
 
Geri
En Üst