Код: Выделить всё
/* main.c */
#include "hello.h"
int main(void)
{
foo();
bar();
return 0;
}
Shell
$ gcc -o main main.o -L. -lhello
$
Так, а теперь вот в последней команде, кропается исполняемый файл main, в котором должны быть два безусловных перехода (или прыжка, как угодно), на адреса (смещения, как угодно), где эти функции лежат. Но эти функции в файле libhello.a непонятно где, их там просто не найти.
Shell
$ nm libhello.a
file_foo.o:
0000000000000000 T foo
0000000000000000 r __FUNCTION__.0
U _GLOBAL_OFFSET_TABLE_
U printf
U putchar
file_bar.o:
0000000000000000 T bar
0000000000000000 r __FUNCTION__.0
U _GLOBAL_OFFSET_TABLE_
U printf
U putchar
$
На всякий случай исходники file_foo.c и file_bar.c и хидер:
Код: Выделить всё
/* file_foo.c */
#include <stdio.h>
#include "hello.h"
void foo (void)
{
printf (__FUNCTION__);
printf ("\n");
}
Код: Выделить всё
/* file_bar.c */
#include <stdio.h>
#include "hello.h"
void bar (void)
{
printf (__FUNCTION__);
printf ("\n");
}
Код: Выделить всё
/* hello.h */
void foo();
void bar();
Shell
$ gcc -c file_foo.c
$ gcc -c file_bar.c
$ ar crs libhello.a file_foo.o file_bar.o
$ gcc -o main main.c -L. -lhello
$ ./main
foo
bar
$
И просто такое наблюдение: если функции будут определены в одном файле, и из него будет скропан объектный файл, то там уже адреса есть, пожалуйста, как, по логике вещей и должно быть:
Код: Выделить всё
/* file_foo_bar.c */
#include <stdio.h>
#include "hello.h"
void foo (void)
{
printf (__FUNCTION__);
printf ("\n");
}
void bar (void)
{
printf (__FUNCTION__);
printf ("\n");
}
Shell
$ gcc -c file_foo_bar.c
$ nm file_foo_bar.o
0000000000000022 T bar
0000000000000000 T foo
0000000000000004 r __FUNCTION__.0
0000000000000000 r __FUNCTION__.1
U _GLOBAL_OFFSET_TABLE_
U printf
U putchar
$