2010-07-14 21 views
5

Tôi đang sử dụng hệ thống cũ hơn có gcc 2.95.3, tôi phải liên kết trong hai đối tượng mặc dù chúng không liên quan gì đến nhau. các phương thức có tên tương tự. Tôi không thể đổi tên một trong số họ, nhưng tôi hy vọng có một cách để xây dựng chúng như là không có mối liên kết phàn nàn. Các phương thức mà nó đang phàn nàn là mỗi phương thức được gọi nội bộ bởi các lớp bên trong đối tượng. Tôi có thể làm gì?Cách lấy "nhiều biểu tượng được xác định" trong liên kết với gcc

Trả lời

9

Nếu bạn có một toolchain GNU hoàn tất, bạn sẽ có thể làm việc xung quanh vấn đề của bạn sử dụng objcopy, như thế này (nếu tôi đã hiểu vấn đề của bạn một cách chính xác):

Dưới đây là hai đối tượng rất giống nhau, "foo "và 'bar', cả hai đều xuất một biểu tượng gọi clash - được sử dụng trong nội bộ, nhưng không thực sự cần phải được xuất khẩu tại tất cả:

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

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

Và đây là đoạn code chính, mà muốn sử dụng cả hai:

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

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

Liên kết chúng lại với nhau không hoạt động:

$ 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 
$ 

Vì vậy, sử dụng objcopy để thay đổi hiển thị clash trong một (hoặc cả hai, nếu bạn thích!) của các đối tượng:

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

Bây giờ bạn có thể liên kết thành công với đối tượng đã sửa đổi - và chương trình hoạt động như cần:

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

Làm cách nào tôi có thể chỉ định cục bộ trước khi biểu mẫu truy cập? Trong mã lý tưởng, nhưng cũng có thể là một phần của đối tượng biên dịch? – CptanPanic

+2

Nếu chức năng xung đột chỉ được sử dụng trong một tệp duy nhất, nó không cần phải xuất khẩu, do đó làm cho nó 'tĩnh' hoạt động. Điều này sẽ làm việc với ví dụ tầm thường của tôi ở trên. (Tôi cho rằng bạn không thể thay đổi nguồn gốc, và cần phải làm việc với các đối tượng thay thế, khi bạn nói bạn không thể đổi tên mọi thứ.) Nếu bạn * cần * các biểu tượng được xuất để tham chiếu giữa các đối tượng ở giai đoạn liên kết trước đó (e, g, liên kết một phần đối tượng hoặc một thư viện), sau đó mọi thứ sẽ khó khăn hơn, và phân loại nó ra sẽ phụ thuộc vào các chi tiết tốt hơn của quá trình xây dựng. –

Các vấn đề liên quan