symb. link do ~

Stanislav Meduna stano-cznews na meduna.org
Sobota Leden 5 10:47:11 CET 2002


On Fri, 4 Jan 2002 21:12:35 +0000 (UTC), Jirka Kosina wrote:

: stat() neni funkce z libc, ale syscall.

Hmm, ako to vlastne funguje? Lebo v .o to este expandovane nie je:

% cat foo.c
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

main()
{
  struct stat buf;
  stat("foo", &buf);
}

% gcc -c foo.c
% nm foo.o
00000000 t gcc2_compiled.
00000000 T main
         U stat


ale vo vysledku uz hej:

% gcc foo.c
% nm a.out | grep stat\$
0804847c T __stat
0804847c W stat

takze sa zda, ze sa o to postara az linker (nechce sa mi patrat,
odkial tie syscally vezme).

Vie niekto, preco je to robene prave takto? Pokial by sa ten
syscall inlinoval uz v .o, usetrilo by sa jedno volanie
(na druhej strane si viem predstavit, ze aj sucasne spravanie
je niekedy potrebne).

<SPECULATION>
Ale zda sa, ze stat je weak symbol - mozno by s tym predsa len
islo nieco robit aj bez zasahu do jadra. A pre vyslovene hardcore
zasahy by mozno slo aj nieco na sposob:

% objcopy --weaken-symbol=__stat a.out a1.out
% nm a1.out | grep stat\$
0804847c W __stat
0804847c W stat

ale to uz je asi blbost, ked je to raz zlinkovane, tak je to
zlinkovane. Tu uz zial moje znalosti koncia a iba spekulujem -
ozve sa niekto znalejsi?
</SPECULATION>

Zdravi
-- 
                                       Stano



Další informace o konferenci Linux