Podpora programu Elnec v Linuxu (bylo: Re: [OT] praca, programovanie vo Visual Basic 6)

Pavel Troller patrol na sinus.cz
Neděle Září 23 14:58:42 CEST 2012


Zdravím,
  já přesně zopakoval Váš pokus:

patrol na arcus:~$ echo 'int main(){gethostbyname("a");}' > a.c
patrol na arcus:~$ gcc -o a -static a.c
patrol na arcus:~$ ldd a
        not a dynamic executable
patrol na arcus:~$ strace a 2>&1 | grep nss
patrol na arcus:~$ strace a
execve("./a", ["a"], [/* 29 vars */])   = 0
uname({sys="Linux", node="arcus", ...}) = 0
brk(0)                                  = 0x1a6c000
brk(0x1a6cf20)                          = 0x1a6cf20
arch_prctl(ARCH_SET_FS, 0x1a6c860)      = 0
brk(0x1a8df20)                          = 0x1a8df20
brk(0x1a8e000)                          = 0x1a8e000
getpid()                                = 4283
open("/etc/resolv.conf", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=195, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa36f0f1000
read(3, "# This file is extracted from /e"..., 4096) = 195
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7fa36f0f1000, 4096)            = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 3
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 0
sendto(3, "\2\0\0\0\r\0\0\0\6\0\0\0hosts\0", 18, MSG_NOSIGNAL, NULL, 0) = 18
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP, revents=POLLIN|POLLHUP}], 1, 5000) = 1
recvmsg(3, {msg_name(0)=NULL, msg_iov(2)=[{"\0\0\0\0\0\0", 6}, {"\0\0\0\0\0\0\0\0", 8}], msg_controllen=0, msg_flags=0x40000000 /* MSG_??? */}, 0x40000000 /* MSG_??? */) = 0
close(3)                                = 0
socket(PF_FILE, SOCK_STREAM, 0)         = 3
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = 0
sendto(3, "\2\0\0\0\4\0\0\0\2\0\0\0a\0", 14, MSG_NOSIGNAL, NULL, 0) = 14
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP, revents=POLLIN|POLLHUP}], 1, 5000) = 1
read(3, "\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377"..., 32) = 32
close(3)                                = 0
exit_group(0)                           = ?
atrol na arcus:~$
  (úplný strace přibalen proto, abych nebyl např. obviněn z toho, že mi
nefunguje grep :-) OPRAVDU neobsahuje žádný odkaz na knihovnu).
  Takže to vypadá, že vskutku není Linux jako Linux :-). Tedy, Vaše distro
asi není vhodné pro výrobu přenositelných aplikací, to moje je.
  To ovšem v závěru nahrává původnímu tvrzení - že totiž kvůli pestrosti
distribucí mohou vznikat při vytváření přenositelných binárek problémy, které
je nutno mít na zřeteli a třeba v tomto případě mít správně zkompilovanou
glibc tak, aby nabízela staticky i tyto moduly, což zřejmě řadové distribuce
ne vždy dělají :-). Nu a pokud se najde něco, co OPRAVDU vzdoruje statickému
linkování, přibalit to k tomu.
  Zdraví Pavel

> Udělal jsem si malý pokus:
>
> $ echo 'int main(){gethostbyname("a");}' > a.c
> $ gcc a.c -o a -static
> /tmp/cccb0VyG.o: In function `main':
> a.c:(.text+0x11): warning: Using 'gethostbyname' in statically linked 
> applications requires at runtime the shared libraries from the glibc 
> version used for linking
>
> a má pravdu:
>
> $ strace ./a 2>&1 |grep nss
> open("/etc/nsswitch.conf", O_RDONLY)    = 3
> read(3, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 503
> open("/lib/libnss_files.so.2", O_RDONLY) = 3
> open("/lib/libnss_mdns4_minimal.so.2", O_RDONLY) = 3
> open("/lib/libnss_dns.so.2", O_RDONLY)  = 3
>
> A to jsou ty moduly, o kterých jsem mluvil.
>
> L.
>
>
> sal(a):
>> Zdravím,
>>    dovoluji si nesouhlasit.
>>    1) Pokud použiji volbu -static při závěrečném linkování binárky, vše, co
>> normálně zavádí dynamický linker (ld.so) během spouštění binárky, včetně
>> patřičných modulů glibc, bude součástí kódu.
>>    2) Zbývají jedině moduly, které se takto nelinkují, ale program si je
>> otevírá sám funkcí dlopen() či podobnými. Pokud by mělo dojít k něčemu
>> takovému, použije se druhá část mého původního vysvětlení, a to "...
>> případně přibalí vlastní verze všech knihoven, které to potřebuje". Pak je
>> třeba ještě nějak zajistit, aby je to našlo, od čehož máme například
>> proměnnou prostředí LD_LIBRARY_PATH, případně, pokud plánujeme ukládat
>> náš produkt na nějaké pevné místo v systému, specifikovat linkeru při
>> závěrečném linkování volbu -rpath.
>>    Licenční problémy nebývají neřešitelné, většina běžných knihoven je dnes
>> pokud vím pod LGPL, která je právě pro tyto případy benevolentnější.
>> Mimochodem, tento jev není přece neznámý ani u windows, spousta programů si
>> také s sebou nese desítky různých .DLL, jako jsou nějaké ty MSCVRT nebo
>> MFC nebo tak podobně, omlouvám se za případné komolení jmen....
>>    Zdraví Pavel
>>
>>    
>>> Ahoj,
>>> statická kompilace je hezká teorie, bohužel v praxi nefunguje. Spousta
>>> knihoven (počínaje glibc) má své dynamicky načítané moduly, které očekává v
>>> souboru pevného jména. Tam zpravidla budou moduly distribuční verze a jsme
>>> tam, kde jsme byli na začátku. Ano, lze je patchnout, ale už to postrádá tu
>>> eleganci. U ne-GPL aplikace se k tomu přidávají ještě licenční problémy.
>>> L.
>>>
>>> Dne 22.9.2012 19:50, Pavel Troller napsal(a):
>>>      
>>>> Zdravím,
>>>>     toto je oblíbený argument "hledačů protiargumentů". Kdo chce, zkompiluje
>>>> aplikaci zcela staticky, případně přibalí vlastní verze všech knihoven, které
>>>> to potřebuje. Takto jsou distribuované např. Google aplikace nebo třeba
>>>> Skype - je to velké, ale chodí to kdekoliv a prakticky to nemůže mít problém.
>>>> Sám takto distribuji několik malých aplikací, vyvinutých pro systémy u nás ve
>>>> firmě - lidé tam používají různé distribuce a chodí to všem.
>>>>     Zdraví Pavel
>>>>
>>>>        
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>      
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>    
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list