Dışsal bağımlılığı olmayan bir C dosyası var ve sadece veri bölümü yapıyorum. Bu dosyayı derlemek ve daha sonra başka bir programa yükleyebileceğim ikili bir blob almak istiyorum, burada işlev bir işlev işaretçisi aracılığıyla kullanılacaktır.Nesne dosyası ikili kod
Bir örnek verelim, işte o zaman f1.bin, f1.o için derlemek ve prog bu gibi kullanmak istiyorum
static const unsigned char mylut[256] = {
[0 ... 127] = 0,
[128 ... 255] = 1,
};
void f1(unsigned char * src, unsigned char * dst, int len)
{
while(len) {
*dst++ = mylut[*src++];
len--;
}
}
bir fictionnal ikili modül, f1.c olduğunu .c
int somefunc() {
unsigned char * codedata;
f1_type_ptr f1_ptr;
/* open f1.bin, and read it into codedata */
/* set function pointer to beginning of loaded data */
f1_ptr =(f1_type_ptr)codedata;
/* call !*/
f1_ptr(src, dst, len);
}
Ben f1.o için f1.c giden varsayalım pozisyon Bağımsızlık almak için -fpic içerir. F1.o'dan f1.bin'e gitmek için 'u kullanabileceğim bayraklar veya bağlayıcı komut dosyaları nelerdir?
Açıklama:
Dinamik bağlama biliyorum. Bu durumda dinamik bağlantı mümkün değildir. Bağlama adımı, yüklüyse, cast func işaretçisi olmalıdır. Lütfen, işletim sistemi desteği olmadığını varsayalım. Yapabilseydim, örneğin PC ile ilgili adresleme ile birlikte yazım f1 yazarım.
Eğer paylaşılan nesne dosyaları kullanabilirsiniz biliyor musunuz? .c dosyasını bir .so dosyasına derlersiniz, daha sonra 'dlopen()' programına yüklersiniz ve 'dlsym()' fonksiyonuna fonksiyon göstergesini alırsınız. O zaman arayabilirsin. –
Libc ve dinamik bağlantıyı unutmayalım – shodanex
'f1.bin' thingie'nin dinamik olarak yüklenmesini istersiniz (örneğin çalışma zamanında)? Sonra paylaşılan bir kütüphane kurmanız ve ldopen() + ldsym() veya diğer modül yükleyicisini (gmodule gibi) kullanmanız gerekir. Bunu başka bir şekilde yapmaya çalışmak, olası güvenlik tehditleri (veri segmentini yürütme vb.) Nedeniyle sert ve reddedilebilir. –