Сегодня, работая с одной пользовательской библиотекой, я обнаружил странное поведение.
Статический библиотечный код содержал функцию отладки main()
. Он не был внутри флага #define
. Так что он присутствует и в библиотеке. И используется ссылка на другую программу, содержащую реальный main()
.
Когда оба они связаны друг с другом, компоновщик не набрасывает ошибку объявления с несколькими объявлениями для main()
. Мне было интересно, как это может произойти.
Чтобы сделать его простым, я создал примерную программу, которая имитировала одно и то же поведение:
$ cat prog.c
#include <stdio.h>
int main()
{
printf("Main in prog.c\n");
}
$ cat static.c
#include <stdio.h>
int main()
{
printf("Main in static.c\n");
}
$ gcc -c static.c
$ ar rcs libstatic.a static.o
$ gcc prog.c -L. -lstatic -o 2main
$ gcc -L. -lstatic -o 1main
$ ./2main
Main in prog.c
$ ./1main
Main in static.c
Как найти бинарную "2main", которую main
выполняет?
Но компиляция обоих из них дает множественную ошибку объявления:
$ gcc prog.c static.o
static.o: In function `main':
static.c:(.text+0x0): multiple definition of `main'
/tmp/ccrFqgkh.o:prog.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
Может кто-нибудь объяснить это поведение?