LINUX.ORG.RU

Ответ на: комментарий от no_NaMe

если собирать через архив - то линкер не включает тела функций на
которые нет ссылок, например:

gcc -c a.c b.c main.c
ar r my.a a.o b.o
gcc -o test main.o my.a
objdump -Dx test > o

grep foo o
[ 37](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 1) 0x000002d0 _foo
  4012c1:       e8 0a 00 00 00          call   4012d0 <_foo>
004012d0 <_foo>:

grep bar o
(пусто)

foo - определена в a.c
bar - определена в b.c

main.c:
#include "a.h"
#include "b.h"

int main()
{
	foo(1);

	return 0;
}


на bar нету ссылок - и она не включена в результирующий бинарник.

Eshkin_kot ★★
()

для msvc++ помнится был ключик -Gy, при котором включались только те функции, на которые есть ссылки

Crocodille
()
Ответ на: комментарий от Eshkin_kot

Нет. Это не совсем то, что я имел ввиду. Меня интересует способ, которым можно добиться линковки бинарника в случае, если функция вызывается из бинарника. У вас в коде функция bar не вызывается, поэтому и линкуется. А мне нужно скомпилировать main.c так, чтобы не прилинковывать к нему архив my.a, но вызов foo(1) оставить в коде. Такое возможно?

no_NaMe
() автор топика
Ответ на: комментарий от no_NaMe

хммм, забавное желание :). вообще-то компилятор ставит своей задачей выдать работающее приложение, а ваше желание разнится с ним. представьте, что будет когда при выполнении вашей программы дойдет дело как раз таки до foo()? если уж на то пошло, сделайте mylib.so в которой будет foo() и прилинкуйтесь к этой библиотеке, либо в теле реализуйте ручную загрузку библиотеки, выловите свою foo() и потом вызывайте по надобности. Другого варианта я не вижу.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.