gcc

2010-07-14 24 views
5

ile bağlantıda "çoklu tanımlı semboller" ile nasıl dolaşılır gcc 2.95.3'e sahip eski bir sistem kullanıyorum, birbirleriyle hiçbir ilgisi olmamasına rağmen, iki nesnede bağlantı kurmak zorundayım benzer şekilde adlandırılmış yöntemler. Bunlardan hiçbirini yeniden adlandıramam, ama umarım onları bağlayıcıya sahip olmamak için onları inşa etmenin bir yolu vardır. Şikayet ettiği yöntemlerin her biri, nesnenin içindeki sınıflar tarafından içsel olarak adlandırılır. Ne yapabilirim?gcc

cevap

9

tam bir GNU toolchain varsa (Ben doğru sorununuzu anladım varsa), böyle objcopy, kullanarak soruna gerekir: Burada

iki çok benzer nesnelerdir, "foo "ve 'clash adında bir sembol ihracat her ikisi de bar', - dahili olarak kullanılan, ancak gerçekten hiç ihraç edilecek gerekmez:

$ cat foo.c 
#include <stdio.h> 
void clash(char *s) { printf("foo: %s\n", s); } 
void foo(char *s) { clash(s); } 
$ 

ve

$ cat bar.c 
#include <stdio.h> 
void clash(char *s) { printf("bar: %s\n", s); } 
void bar(char *s) { clash(s); } 
$ 
Yani

$ gcc -Wall -c foo.c 
$ gcc -Wall -c bar.c 
$ gcc -Wall -c main.c 
$ gcc -o test main.o foo.o bar.o 
bar.o: In function `clash': 
bar.c:(.text+0x0): multiple definition of `clash' 
foo.o:foo.c:(.text+0x0): first defined here 
collect2: ld returned 1 exit status 
$ 

birinde clash görünürlüğünü değiştirmek için objcopy kullanın (veya: onları bir arada Bağlama

$ cat main.c 
extern void foo(char *s); 
extern void bar(char *s); 

int main(void) 
{ 
    foo("Hello"); 
    bar("world"); 
    return 0; 
} 
$ 

çalışmaz:

Ve burada her ikisini de kullanmak istediği ana kod, var !

$ objcopy --localize-symbol=clash bar.o bar2.o 
$ 

Şimdi değiştirilmiş nesne ile başarıyla bağlayabilir - ve program olarak davranır: Her iki, nesnelerden) seviyorsanız

$ gcc -o test main.o foo.o bar2.o 
$ ./test 
foo: Hello 
bar: world 
$ 
+1

Nesne oluşmadan önce yerel nasıl belirleyebilirim? Kodda ideal olarak, ama belki de nesnenin bir parçası olarak derlenebilir? – CptanPanic

+2

Çatışma işlevi yalnızca tek bir dosyada kullanılıyorsa, hiç dışa aktarılmaya ihtiyaç duymaz, bu yüzden "statik" çalışmalıdır. Bu, yukarıdaki önemsiz örneğimle çalışacaktır. (Asıl kaynağı değiştiremeyeceğinizi ve bunun yerine, nesneleri yeniden adlandırabileceğinizi söylediğinizde, nesnelerle yeniden çalışmanız gerektiğini varsaydım.) Daha önceki bir bağlantı aşamasında nesneler arasındaki referanslar için dışa aktarılan sembollere * ihtiyacınız varsa * (e, g, kısmi bir nesneyi veya bir kütüphaneyi birbirine bağlar), daha sonra işler daha zor olurdu ve onu sıralamak, inşa sürecinin daha ince ayrıntılarına bağlı olacaktır. –