C/C++

2012-07-17 20 views
6

'daki bir talimatın adresini öğrenin Bir talimatın adresini almak için herhangi bir yol var mı? Talimatı etiketlemiş ve etiketin adresini almayı denedim, ancak yalnızca GCC derleyicisinde & & işleci ile çalışıyor gibi görünüyor. (Bakınız: this article) Ya diğer derleyiciler?C/C++

Bu sorunun herhangi bir fikri var mı?

+0

Neden soruyorsunuz? –

+4

C++ 'nın talimatlarla uygulanması zorunlu değildir. –

+0

Merhaba Basile, şu anda talimat/veri izleme özellikleri hakkında biraz araştırma yapıyorum. – nigong

cevap

4

C veya C++ dil standartlarının eğitimden söz ettiğinden emin değilim; büyük bir insan kölesi grubu tarafından yürütülecek şekilde derlenmiş bir C programını çalıştırabilirsiniz (ancak standart uygun olsa bile bu etik olmazdı). Kendi başına bir kalem ve kağıt ile basit bir minik program çalıştırabilirsin, bir C yorumlayıcı kullanabilirsin, vb ...

Bir C veya C++ derleyicisinin optimize edilmesi bazı C ifadelerini çeşitli makine yönergelerine de çevirebilir çeşitli yerlerde bulunan (özellikle, derleyiciler inline veya klonlama fonksiyonlarını veya hatta temel blokları, hatta herhangi bir inline anahtar kelime kaynak kodu). Çoğu sistemde, dönüş adresini (yani, arayanın adresi) bir imleç değeri olarak döndüren bir yordam (örneğin, derleme) kodunu sistemden alabilirsiniz.

GCC (ve uyumlu derleyiciler, belki de Clang/LLVM) ile, __builtin_return_address ve ilgili yerleşikleri kullanabilirsiniz.

Linux'taki Gnu Libc size backtrace (ama denediğimde, onun tarafından düşünüldüm) sunar. -fno-frame-pointer

ile derleme yaparken

Bildirimi bu hileler Ayrıca GCC örneğin özelleştirme düşünebilirsiniz işe yaramayabilir eklentileri veya MELT uzantıları ile (MELT, GCC'yi GCC'ye kodlayan eklentilerden daha kolay genişletmek için GCC'ye GPLv3 eklentisi olarak uygulanan etki alanına özgü bir dildir). Özelleştirilmiş KİK'niz, uygun yerlerde enstrümantasyon işlevlerine çağrı ekleyebilir.

+0

Merhaba Basile, cevabınız için teşekkürler. Ama ben talimatların ve ifadenin ilişkisini söylemek istemedim. Yapmak istediğim sadece C/C++'daki bir ifadenin veya talimatın adresini almak. :) – nigong

+1

@nigong Temelde, talimatların bile olmayabileceğini söylüyor. Özellikle de bir CPU yerine köleler tarafından çalıştırılıyorsa. – Mysticial

+1

Eğer 'talimat' ve 'açıklama' yeterince benzer kavramlar olsaydı, bu mümkün olabilir. Bununla birlikte, çoğu ifade, birbirini takip eden (döngü yapıları, vb.) Bile olmayan ve diğer ifadelerden gelen talimatlarla araya getirilmiş (optimizasyon, talimat programlama) birden fazla komut üretir. – twalberg

0

Bir komutun adresine yakın olan tek standart C veya C++ yapısı, demek istediğim şey değil, bir işlev işaretçisidir. Bununla birlikte, gerekli kod bloklarını içeren işlevler yerine işaretçi kullanarak gcc etiket değerleri ile yapabileceklerinizden çoğunu gerçekleştirebilirsiniz.

C/C++ 'da başka seçenek yoktur.

2

Dikkat: Burada kutudan Yolu ..

Eğer bağlayıcı uygulamaları nesneler (fonksiyonları ve verileri) (akraba veya başka türlü) adreslerini içeren bir harita dosyası oluşturmak var mı? Uygulamanız daha sonra sadece linker harita dosyasını ayrıştırdı ...

+0

Linux'ta 'dladdr' sizin için ' ve' dlopen''nı veya en azından çok yardımcı olur. –

İlgili konular