This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
RE: symbol collision
- From: vijay nag <vijunag at gmail dot com>
- To: binutils at sourceware dot org, "gcc-help at gcc dot gnu dot org" <gcc-help at gcc dot gnu dot org>
- Date: Thu, 7 Nov 2013 00:20:02 +0530
- Subject: RE: symbol collision
- Authentication-results: sourceware.org; auth=none
Hello,
I have two functions with same name but with different proto-types
defined in two different libraries. Somehow linker seems to be picking
silently(no multiple definition errors) unmatched version of the
function while linking.
To illustrate the problem, I created an example code-snippet with the
following arrangement.
$] cat 1.h
#ifndef 1_H_
#define 1_H_
int zlib_compress(void);
#endif // 1_H_
$ cat 1.c
#include "1.h"
#include "2.h"
int zlib_compress(void)
{
int a;
crc32(&a);
}
]$ cat 2.h
#ifndef 2_H_
#define 2_H_
extern int crc32(int *a);
#endif // _2_H_
]$ cat main.c
#include <stdio.h>
#include "1.h"
int crc32(int a, int b)
{
printf("crc32 in main.c\n");
}
int main()
{
printf("Calling Zlib compress\n");
zlib_compress();
}
The executable "main" was created the following way.
[linker]$ gcc -I./ 1.c -c
[linker]$ gcc -I./ 2.c -c
[linker]$ ar rcs lib12.a 1.o 2.o
[linker]$ gcc main.o -L./ -l12 -o main
[linker]$./main
Calling Zlib compress
crc32 in main.c
Here I was expecting linker to throw multiple-definition error perhaps
it choose "crc32(int, int)" defined in main.o to link in the final
executable. Any reason why linker is choosing "crc32" from main.o
rather than from lib12.a itself ?