Farz edelim ki open() sistem çağrısını tamamen devralmak, belki de gerçek sistem çağrısı yapmak ve bazı günlük işlemleri yapmak istiyorum. Open() giriş noktasını ele alan bir (kullanıcı tarafından oluşturulmuş) paylaşılan nesne kitaplığını yüklemek için One way to do this is to use LD_PRELOAD.Linux'ta bir syscall işlevini nasıl yeniden (veya sarma) yaparım?
Kullanıcı tarafından oluşturulan open() rutini, işaretçiyi open()
glibc işlevinin dlsym()
tarafından almasını ve çağırmasını sağlar. Bununla birlikte, yukarıda önerilen çözüm dinamik bir çözümdür. Kendi open()
sarmalayıcımı statik olarak bağlamak istediğimi varsayalım. Bunu nasıl yaparım? Sanırım mekanizma aynı, ama aynı zamanda kullanıcı tanımlı open()
ve libc open()
arasında bir sembol çatışması olacağını tahmin ediyorum.
Aynı amaca ulaşmak için lütfen başka teknikleri paylaşın.
Kodunuza yalnızca bir sarıcı işlevi/makro yapıştırıyorsunuz? –
@Seamus: Makroları kullanmamayı tercih ediyorum. Gerçekten bir sorunum yok. Sadece SO bilgisini arttırmak ve yeni bir hile öğrenmek istiyorum. –