Incorrectly built binary which accesses errno ...

Jan Kokoska kokoska.jan na globe.cz
Středa Leden 21 12:16:33 CET 2004


On Wed, 2004-01-21 at 11:30, Miroslav BENES wrote:
> Přeji krásný den !
> 

Ja Vam rovnez,

> "Incorrectly built binary which accesses errno or h_errno
> directly Needs to be fixed."
> 
> 
> Čím je způsobeno a co se s tím dá dělat ?

Ve drivejsi implementaci bylo errno staticky alokovany integer, coz
zpusobovalo problemy ve vicevlaknovych aplikacich (byla jedna promenna
pro vsechna vlakna aplikace), libc funkce, ktere errno vyuzivaji tudiz
nebyly reentrantni (neslo pocitat s tim, ze nastavite errno na 0,
zavolate funkci a v errno po jejim ukonceni najdete jeji navratovou
hodnotu, mohla to byt navratova hodnota jine funkce z jineho vlakna).

> 
> 
> Google mi k tomu našel pár odkazů, ale nejsem z toho moc moudrý.
> jestli jsem to správně pochopil, je teď definován objekt errno
> jako makro (což podle normy lze), ale (starší) aplikace s touto
> možnstí nepočítaly.

Ano, ted je to makro, ve kterem se promenna staticky alokuje ve stacku
kazdeho vlakna zvlast.

> V jedné diskusi je příspěvek od Jakub Jelínka, kde doporučuje
> před spouštění aplikace předřadit :
> 
> LD_ASSUME_KERNEL=2.2.5 <binárka>
> 
> Dotaz č.1 : Nakolik je zmíněná chyba závažná ? Když ji budu
> ignorovat, co se může stát ? Může dojít ke zhroucení aplikace
> nebo jádra ve chvíli kdy dojde k nějaké systémové chybě ?

Urcita sance tu je, zalezi samozrejme na kodu, ktery se (ne)vykonava na
zaklade navratove hodnoty nejake funkce.

> Dotaz č.2 : Jak účinný je uvedený způsob "záplatování" - bude
> možné ho používat i v budoucnu ? Jde mi o to, jestli můžu
> očekávat problémy v případě budoucího přechodu na novější verzi
> glibc (z logiky věci vyplývá, že je to dočasná berlička pro
> zastaralé aplikace a že se tedy nemusí objevovat v nových
> verzích glibc). Stejně tak by mě zajímalo, jaký vliv na tento
> problém by měl přechod na kernel řady 2.6.
> Rekompilace není bohužel mořná - od aplikace nejsou k dispozici
> zdrojáky (mám jen binárky) :(

Bohuzel nevim presne, jak ta direktiva linkeru funguje, takze vam nemohu
poradit.. ja vsechen svuj kod kompiluji s D_REENTRANT, z cehoz mimo jine
vyplyva pouziti errno makra misto drivejsi implementace. Domnivam se
ale, ze to muze fungovat pouze u dynamicky linkovanych aplikaci (ld), co
se staticky zalinkovalo pri kompilaci uz nijak nezachranite.

> Dotaz č.3 : Jak se dá zařídit, aby tato "berlička" uspokojila
> všechny binárky z aplikace ? U těch které spouštím je to
> jednoduché - místo binárky budu spouštět skript do kterého tu
> opravu napíšu. Ale ty binárky se pak můžou samovolně volat i
> navzájem. Bude toto předřazení platné i pro takto spouštěné
> další binárky ? Nebo se to dá ošetřit jinak ?

Pokud se nejak cilene nezbavi promennych prostredi nastavenych
rodicovskym procesem (tady shellem), tak by to i tam melo fungovat.

Ve vasi situaci patrne muzete jen detailneji prozkoumat, co
LD_ASSUME_KERNEL=2.2.5 vlastne dela a verit, ze to bude stacit.

-- 
Jan Kokoska




Další informace o konferenci Linux