123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190 |
- diff -urN uClibc-0.9.28.orig/include/elf.h uClibc-0.9.28/include/elf.h
- --- uClibc-0.9.28.orig/include/elf.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/include/elf.h 2006-04-28 00:14:35.000000000 -0600
- @@ -142,6 +142,7 @@
- #define ELFOSABI_HPUX 1 /* HP-UX */
- #define ELFOSABI_NETBSD 2 /* NetBSD. */
- #define ELFOSABI_LINUX 3 /* Linux. */
- +#define ELFOSABI_HURD 4 /* GNU/Hurd */
- #define ELFOSABI_SOLARIS 6 /* Sun Solaris. */
- #define ELFOSABI_AIX 7 /* IBM AIX. */
- #define ELFOSABI_IRIX 8 /* SGI Irix. */
- @@ -149,6 +150,9 @@
- #define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */
- #define ELFOSABI_MODESTO 11 /* Novell Modesto. */
- #define ELFOSABI_OPENBSD 12 /* OpenBSD. */
- +#define ELFOSABI_OPENVMS 13 /* OpenVMS */
- +#define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */
- +#define ELFOSABI_AROS 15 /* Amiga Research OS */
- #define ELFOSABI_ARM 97 /* ARM */
- #define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
-
- @@ -177,6 +181,7 @@
- #define EM_386 3 /* Intel 80386 */
- #define EM_68K 4 /* Motorola m68k family */
- #define EM_88K 5 /* Motorola m88k family */
- +#define EM_486 6 /* Intel 80486 *//* Reserved for future use */
- #define EM_860 7 /* Intel 80860 */
- #define EM_MIPS 8 /* MIPS R3000 big-endian */
- #define EM_S370 9 /* IBM System/370 */
- @@ -193,7 +198,8 @@
- #define EM_V800 36 /* NEC V800 series */
- #define EM_FR20 37 /* Fujitsu FR20 */
- #define EM_RH32 38 /* TRW RH-32 */
- -#define EM_RCE 39 /* Motorola RCE */
- +#define EM_MCORE 39 /* Motorola M*Core */ /* May also be taken by Fujitsu MMA */
- +#define EM_RCE 39 /* Old name for MCore */
- #define EM_ARM 40 /* ARM */
- #define EM_FAKE_ALPHA 41 /* Digital Alpha */
- #define EM_SH 42 /* Renesas SH */
- @@ -248,18 +254,105 @@
- #define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */
- #define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */
- #define EM_XTENSA 94 /* Tensilica Xtensa Architecture */
- +#define EM_IP2K 101 /* Ubicom IP2022 micro controller */
- +#define EM_CR 103 /* National Semiconductor CompactRISC */
- +#define EM_MSP430 105 /* TI msp430 micro controller */
- +#define EM_BLACKFIN 106 /* Analog Devices Blackfin */
- +#define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */
- +#define EM_CRX 114 /* National Semiconductor CRX */
- #define EM_NUM 95
-
- -/* If it is necessary to assign new unofficial EM_* values, please
- - pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
- - chances of collision with official or non-GNU unofficial values. */
- +/* If it is necessary to assign new unofficial EM_* values, please pick large
- + random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision
- + with official or non-GNU unofficial values.
-
- -/* Fujitsu FR-V. */
- + NOTE: Do not just increment the most recent number by one.
- + Somebody else somewhere will do exactly the same thing, and you
- + will have a collision. Instead, pick a random number.
- +
- + Normally, each entity or maintainer responsible for a machine with an
- + unofficial e_machine number should eventually ask registry@caldera.com for
- + an officially blessed number to be added to the list above. */
- +
- +/* picoJava */
- +#define EM_PJ_OLD 99
- +
- +/* Cygnus PowerPC ELF backend. Written in the absence of an ABI. */
- +#define EM_CYGNUS_POWERPC 0x9025
- +
- +/* Old version of Sparc v9, from before the ABI; this should be
- + removed shortly. */
- +#define EM_OLD_SPARCV9 11
- +
- +/* Old version of PowerPC, this should be removed shortly. */
- +#define EM_PPC_OLD 17
- +
- +/* (Deprecated) Temporary number for the OpenRISC processor. */
- +#define EM_OR32 0x8472
- +
- +/* Renesas M32C and M16C. */
- +#define EM_M32C 0xFEB0
- +
- +/* Cygnus M32R ELF backend. Written in the absence of an ABI. */
- +#define EM_CYGNUS_M32R 0x9041
- +
- +/* old S/390 backend magic number. Written in the absence of an ABI. */
- +#define EM_S390_OLD 0xa390
- +
- +/* D10V backend magic number. Written in the absence of an ABI. */
- +#define EM_CYGNUS_D10V 0x7650
- +
- +/* D30V backend magic number. Written in the absence of an ABI. */
- +#define EM_CYGNUS_D30V 0x7676
- +
- +/* V850 backend magic number. Written in the absense of an ABI. */
- +#define EM_CYGNUS_V850 0x9080
- +
- +/* mn10200 and mn10300 backend magic numbers.
- + Written in the absense of an ABI. */
- +#define EM_CYGNUS_MN10200 0xdead
- +#define EM_CYGNUS_MN10300 0xbeef
- +
- +/* FR30 magic number - no EABI available. */
- +#define EM_CYGNUS_FR30 0x3330
- +
- +/* AVR magic number
- + Written in the absense of an ABI. */
- +#define EM_AVR_OLD 0x1057
- +
- +/* OpenRISC magic number
- + Written in the absense of an ABI. */
- +#define EM_OPENRISC_OLD 0x3426
- +
- +/* DLX magic number
- + Written in the absense of an ABI. */
- +#define EM_DLX 0x5aa5
- +
- +#define EM_XSTORMY16 0xad45
- +
- +/* FRV magic number - no EABI available??. */
- #define EM_CYGNUS_FRV 0x5441
-
- +/* Ubicom IP2xxx; no ABI */
- +#define EM_IP2K_OLD 0x8217
- +
- +#define EM_MT 0x2530 /* Morpho MT; no ABI */
- +
- +/* MSP430 magic number
- + Written in the absense everything. */
- +#define EM_MSP430_OLD 0x1059
- +
- +/* Vitesse IQ2000. */
- +#define EM_IQ2000 0xFEBA
- +
- +/* Old, unofficial value for Xtensa. */
- +#define EM_XTENSA_OLD 0xabc7
- +
- +/* Alpha backend magic number. Written in the absence of an ABI. */
- #define EM_ALPHA 0x9026
- -#define EM_NIOS32 0xfebb /* Altera Nios 32 */
- -#define EM_ALTERA_NIOS2 0x9ee5 /* Altera Nios II */
- +
- +/* NIOS magic number - no EABI available. */
- +#define EM_NIOS32 0xFEBB
-
- /* V850 backend magic number. Written in the absense of an ABI. */
- #define EM_CYGNUS_V850 0x9080
- @@ -2498,6 +2591,12 @@
- #define R_390_NUM 61
-
-
- +/* CRIS flags. */
- +#define EF_CRIS_VARIANT_MASK 0x0000000e
- +#define EF_CRIS_VARIANT_ANY_V0_V10 0x00000000
- +#define EF_CRIS_VARIANT_V32 0x00000002
- +#define EF_CRIS_VARIANT_COMMON_V10_V32 0x00000004
- +
- /* CRIS relocations. */
- #define R_CRIS_NONE 0
- #define R_CRIS_8 1
- @@ -2688,6 +2787,7 @@
- #define R_V850_NUM 25
-
-
- +/* Renesas H8/300 Relocations */
- #define R_H8_NONE 0
- #define R_H8_DIR32 1
- #define R_H8_DIR32_28 2
- @@ -2731,8 +2831,7 @@
- #define R_H8_DIR32A16 63
- #define R_H8_ABS32 65
- #define R_H8_ABS32A16 127
- -
- -/* Altera NIOS specific definitions. */
- +#define R_H8_NUM 128
-
- /* NIOS relocations. */
- #define R_NIOS_NONE 0
- diff -urN uClibc-0.9.28.orig/include/errno.h uClibc-0.9.28/include/errno.h
- --- uClibc-0.9.28.orig/include/errno.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/include/errno.h 2006-04-28 00:14:35.000000000 -0600
- @@ -43,9 +43,11 @@
- variable. This redeclaration using the macro still works, but it
- will be a function declaration without a prototype and may trigger
- a -Wstrict-prototypes warning. */
- +#ifndef __ASSEMBLER__
- #ifndef errno
- extern int errno;
- #endif
- +#endif
-
- #if 0 /*def __USE_GNU uClibc note: not supported */
-
- diff -urN uClibc-0.9.28.orig/ldso/Makefile uClibc-0.9.28/ldso/Makefile
- --- uClibc-0.9.28.orig/ldso/Makefile 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/Makefile 2006-04-28 00:14:35.000000000 -0600
- @@ -37,15 +37,12 @@
-
- LN_HEADERS := $(patsubst %, include/%, elf.h)
- LN_ARCH_HEADERS := $(patsubst %, include/%, dl-startup.h dl-syscalls.h dl-sysdep.h dl-debug.h)
- -HEADERS := $(LN_HEADERS) $(LN_ARCH_HEADERS) include/dl-progname.h
- +HEADERS := $(LN_HEADERS) $(LN_ARCH_HEADERS)
- headers: $(HEADERS)
- $(LN_HEADERS):
- $(LN) -fs $(TOPDIR)../$@ $@
- $(LN_ARCH_HEADERS):
- $(LN) -fs ../ldso/$(TARGET_ARCH)/$(patsubst include/%,%,$@) $@
- -include/dl-progname.h:
- - echo '#include "$(TARGET_ARCH)/elfinterp.c"' \
- - > include/dl-progname.h
-
- clean:
- set -e ; for d in $(DIRS) ; do $(MAKE) -C $$d $@ ; done
- diff -urN uClibc-0.9.28.orig/ldso/include/dl-defs.h uClibc-0.9.28/ldso/include/dl-defs.h
- --- uClibc-0.9.28.orig/ldso/include/dl-defs.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/dl-defs.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,6 +1,29 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- #ifndef _LD_DEFS_H
- #define _LD_DEFS_H
-
- +#define FLAG_ANY -1
- +#define FLAG_TYPE_MASK 0x00ff
- +#define FLAG_LIBC4 0x0000
- +#define FLAG_ELF 0x0001
- +#define FLAG_ELF_LIBC5 0x0002
- +#define FLAG_ELF_LIBC6 0x0003
- +#define FLAG_ELF_UCLIBC 0x0004
- +#define FLAG_REQUIRED_MASK 0xff00
- +#define FLAG_SPARC_LIB64 0x0100
- +#define FLAG_IA64_LIB64 0x0200
- +#define FLAG_X8664_LIB64 0x0300
- +#define FLAG_S390_LIB64 0x0400
- +#define FLAG_POWERPC_LIB64 0x0500
- +#define FLAG_MIPS64_LIBN32 0x0600
- +#define FLAG_MIPS64_LIBN64 0x0700
- +
- #define LIB_ANY -1
- #define LIB_DLL 0
- #define LIB_ELF 1
- diff -urN uClibc-0.9.28.orig/ldso/include/dl-elf.h uClibc-0.9.28/ldso/include/dl-elf.h
- --- uClibc-0.9.28.orig/ldso/include/dl-elf.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/dl-elf.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,3 +1,10 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- #ifndef LINUXELF_H
- #define LINUXELF_H
-
- diff -urN uClibc-0.9.28.orig/ldso/include/dl-hash.h uClibc-0.9.28/ldso/include/dl-hash.h
- --- uClibc-0.9.28.orig/ldso/include/dl-hash.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/dl-hash.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,3 +1,10 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- #ifndef _LD_HASH_H_
- #define _LD_HASH_H_
-
- @@ -32,15 +39,15 @@
- unsigned short usage_count;
- unsigned short int init_flag;
- unsigned long rtld_flags; /* RTLD_GLOBAL, RTLD_NOW etc. */
- - Elf32_Word nbucket;
- - Elf32_Word *elf_buckets;
- + Elf_Symndx nbucket;
- + Elf_Symndx *elf_buckets;
- struct init_fini_list *init_fini;
- struct init_fini_list *rtld_local; /* keep tack of RTLD_LOCAL libs in same group */
- /*
- * These are only used with ELF style shared libraries
- */
- - Elf32_Word nchain;
- - Elf32_Word *chains;
- + Elf_Symndx nchain;
- + Elf_Symndx *chains;
- unsigned long dynamic_info[DYNAMIC_SIZE];
-
- unsigned long n_phent;
- @@ -49,6 +56,9 @@
- ElfW(Addr) relro_addr;
- size_t relro_size;
-
- + dev_t st_dev; /* device */
- + ino_t st_ino; /* inode */
- +
- #ifdef __powerpc__
- /* this is used to store the address of relocation data words, so
- * we don't have to calculate it every time, which requires a divide */
- @@ -66,7 +76,6 @@
- extern struct elf_resolve * _dl_loaded_modules;
- extern struct dyn_elf * _dl_handles;
-
- -extern struct elf_resolve * _dl_check_hashed_files(const char * libname);
- extern struct elf_resolve * _dl_add_elf_hash_table(const char * libname,
- char * loadaddr, unsigned long * dynamic_info,
- unsigned long dynamic_addr, unsigned long dynamic_size);
- diff -urN uClibc-0.9.28.orig/ldso/include/dl-string.h uClibc-0.9.28/ldso/include/dl-string.h
- --- uClibc-0.9.28.orig/ldso/include/dl-string.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/dl-string.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,9 +1,24 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- #ifndef _LINUX_STRING_H_
- #define _LINUX_STRING_H_
-
- -#include <dl-sysdep.h> // for do_rem
- +#include <dl-sysdep.h> /* for do_rem */
- #include <features.h>
-
- +/* provide some sane defaults */
- +#ifndef do_rem
- +# define do_rem(result, n, base) ((result) = (n) % (base))
- +#endif
- +#ifndef do_div_10
- +# define do_div_10(result, remain) ((result) /= 10)
- +#endif
- +
- static size_t _dl_strlen(const char * str);
- static char *_dl_strcat(char *dst, const char *src);
- static char * _dl_strcpy(char * dst,const char *src);
- @@ -26,8 +41,8 @@
- static __always_inline size_t _dl_strlen(const char * str)
- {
- register const char *ptr = (char *) str-1;
- -
- - while (*++ptr);
- + while (*++ptr)
- + ;/* empty */
- return (ptr - str);
- }
-
- @@ -49,7 +64,8 @@
- register char *ptr = dst;
-
- dst--;src--;
- - while ((*++dst = *++src) != 0);
- + while ((*++dst = *++src) != 0)
- + ;/* empty */
-
- return ptr;
- }
- @@ -63,8 +79,7 @@
- c2 = (unsigned char) *++s2;
- if (c1 == '\0')
- return c1 - c2;
- - }
- - while (c1 == c2);
- + } while (c1 == c2);
-
- return c1 - c2;
- }
- @@ -98,43 +113,41 @@
- return 0;
- }
-
- -static inline char * _dl_strrchr(const char *str, int c)
- +static __always_inline char * _dl_strrchr(const char *str, int c)
- {
- - register char *prev = 0;
- - register char *ptr = (char *) str-1;
- + register char *prev = 0;
- + register char *ptr = (char *) str-1;
-
- - while (*++ptr != '\0') {
- - if (*ptr == c)
- - prev = ptr;
- - }
- - if (c == '\0')
- - return(ptr);
- - return(prev);
- + while (*++ptr != '\0') {
- + if (*ptr == c)
- + prev = ptr;
- + }
- + if (c == '\0')
- + return(ptr);
- + return(prev);
- }
-
- -static inline char * _dl_strstr(const char *s1, const char *s2)
- +static __always_inline char * _dl_strstr(const char *s1, const char *s2)
- {
- - register const char *s = s1;
- - register const char *p = s2;
- + register const char *s = s1;
- + register const char *p = s2;
-
- - do {
- - if (!*p) {
- - return (char *) s1;;
- - }
- - if (*p == *s) {
- - ++p;
- - ++s;
- - } else {
- - p = s2;
- - if (!*s) {
- - return NULL;
- - }
- - s = ++s1;
- - }
- - } while (1);
- + do {
- + if (!*p)
- + return (char *) s1;;
- + if (*p == *s) {
- + ++p;
- + ++s;
- + } else {
- + p = s2;
- + if (!*s)
- + return NULL;
- + s = ++s1;
- + }
- + } while (1);
- }
-
- -static inline void * _dl_memcpy(void * dst, const void * src, size_t len)
- +static __always_inline void * _dl_memcpy(void * dst, const void * src, size_t len)
- {
- register char *a = dst-1;
- register const char *b = src-1;
- @@ -163,27 +176,28 @@
- /* Will generate smaller and faster code due to loop unrolling.*/
- static __always_inline void * _dl_memset(void *to, int c, size_t n)
- {
- - unsigned long chunks;
- - unsigned long *tmp_to;
- + unsigned long chunks;
- + unsigned long *tmp_to;
- unsigned char *tmp_char;
-
- - chunks = n / 4;
- - tmp_to = to + n;
- - c = c << 8 | c;
- - c = c << 16 | c;
- - if (!chunks)
- - goto lessthan4;
- - do {
- - *--tmp_to = c;
- - } while (--chunks);
- - lessthan4:
- - n = n % 4;
- - if (!n ) return to;
- - tmp_char = (unsigned char *)tmp_to;
- - do {
- - *--tmp_char = c;
- - } while (--n);
- - return to;
- + chunks = n / 4;
- + tmp_to = to + n;
- + c = c << 8 | c;
- + c = c << 16 | c;
- + if (!chunks)
- + goto lessthan4;
- + do {
- + *--tmp_to = c;
- + } while (--chunks);
- +lessthan4:
- + n = n % 4;
- + if (!n)
- + return to;
- + tmp_char = (unsigned char *)tmp_to;
- + do {
- + *--tmp_char = c;
- + } while (--n);
- + return to;
- }
- #else
- static __always_inline void * _dl_memset(void * str,int c,size_t len)
- @@ -225,10 +239,10 @@
- char *p = &local[22];
- *--p = '\0';
- do {
- - char temp;
- - do_rem(temp, i, 10);
- - *--p = '0' + temp;
- - i /= 10;
- + char temp;
- + do_rem(temp, i, 10);
- + *--p = '0' + temp;
- + do_div_10(i, temp);
- } while (i > 0);
- return p;
- }
- @@ -242,9 +256,9 @@
- do {
- char temp = i & 0xf;
- if (temp <= 0x09)
- - *--p = '0' + temp;
- + *--p = '0' + temp;
- else
- - *--p = 'a' - 0x0a + temp;
- + *--p = 'a' - 0x0a + temp;
- i >>= 4;
- } while (i > 0);
- *--p = 'x';
- @@ -270,8 +284,8 @@
-
- /* On some arches constant strings are referenced through the GOT.
- * This requires that load_addr must already be defined... */
- -#if defined(mc68000) || defined(__arm__) || defined(__mips__) \
- - || defined(__sh__) || defined(__powerpc__)
- +#if defined(mc68000) || defined(__arm__) || defined(__thumb__) || \
- + defined(__mips__) || defined(__sh__) || defined(__powerpc__)
- # define CONSTANT_STRING_GOT_FIXUP(X) \
- if ((X) < (const char *) load_addr) (X) += load_addr
- # define NO_EARLY_SEND_STDERR
- @@ -318,7 +332,7 @@
- do { \
- do_rem(v, (X), 10); \
- *--tmp2 = '0' + v; \
- - (X) /= 10; \
- + do_div_10((X), v); \
- } while ((X) > 0); \
- _dl_write(2, tmp2, tmp1 - tmp2 + sizeof(tmp) - 1); \
- }
- diff -urN uClibc-0.9.28.orig/ldso/include/dl-syscall.h uClibc-0.9.28/ldso/include/dl-syscall.h
- --- uClibc-0.9.28.orig/ldso/include/dl-syscall.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/dl-syscall.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,3 +1,10 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- #ifndef _LD_SYSCALL_H_
- #define _LD_SYSCALL_H_
-
- @@ -12,9 +19,8 @@
- #include <bits/kernel_stat.h>
- #include <bits/kernel_types.h>
-
- -
- /* _dl_open() parameters */
- -#define O_RDONLY 0x0000
- +#define O_RDONLY 00
- #define O_WRONLY 01
- #define O_RDWR 02
- #define O_CREAT 0100
- @@ -39,18 +45,6 @@
- #define S_IWRITE 0200 /* Write by owner. */
- #define S_IEXEC 0100 /* Execute by owner. */
-
- -/* Stuff for _dl_mmap */
- -#if 0
- -#define MAP_FAILED ((void *) -1)
- -#define _dl_mmap_check_error(X) (((void *)X) == MAP_FAILED)
- -#else
- -#ifndef _dl_MAX_ERRNO
- -#define _dl_MAX_ERRNO 4096
- -#endif
- -#define _dl_mmap_check_error(__res) \
- - (((long)__res) < 0 && ((long)__res) >= -_dl_MAX_ERRNO)
- -#endif
- -
-
-
- /* Here are the definitions for some syscalls that are used
- @@ -66,54 +60,125 @@
- static inline _syscall1(int, _dl_close, int, fd);
-
- #define __NR__dl_open __NR_open
- -static inline _syscall3(int, _dl_open, const char *, fn, int, flags, __kernel_mode_t, mode);
- +static inline _syscall3(int, _dl_open, const char *, fn, int, flags,
- + __kernel_mode_t, mode);
-
- #define __NR__dl_write __NR_write
- static inline _syscall3(unsigned long, _dl_write, int, fd,
- - const void *, buf, unsigned long, count);
- + const void *, buf, unsigned long, count);
-
- #define __NR__dl_read __NR_read
- static inline _syscall3(unsigned long, _dl_read, int, fd,
- - const void *, buf, unsigned long, count);
- + const void *, buf, unsigned long, count);
-
- #define __NR__dl_mprotect __NR_mprotect
- -static inline _syscall3(int, _dl_mprotect, const void *, addr, unsigned long, len, int, prot);
- +static inline _syscall3(int, _dl_mprotect, const void *, addr,
- + unsigned long, len, int, prot);
-
- #define __NR__dl_stat __NR_stat
- -static inline _syscall2(int, _dl_stat, const char *, file_name, struct stat *, buf);
- +static inline _syscall2(int, _dl_stat, const char *, file_name,
- + struct stat *, buf);
- +
- +#define __NR__dl_fstat __NR_fstat
- +static inline _syscall2(int, _dl_fstat, int, fd, struct stat *, buf);
-
- #define __NR__dl_munmap __NR_munmap
- static inline _syscall2(int, _dl_munmap, void *, start, unsigned long, length);
-
- +#ifdef __NR_getxuid
- +# define __NR_getuid __NR_getxuid
- +#endif
- #define __NR__dl_getuid __NR_getuid
- static inline _syscall0(uid_t, _dl_getuid);
-
- +#ifndef __NR_geteuid
- +# define __NR_geteuid __NR_getuid
- +#endif
- #define __NR__dl_geteuid __NR_geteuid
- static inline _syscall0(uid_t, _dl_geteuid);
-
- +#ifdef __NR_getxgid
- +# define __NR_getgid __NR_getxgid
- +#endif
- #define __NR__dl_getgid __NR_getgid
- static inline _syscall0(gid_t, _dl_getgid);
-
- +#ifndef __NR_getegid
- +# define __NR_getegid __NR_getgid
- +#endif
- #define __NR__dl_getegid __NR_getegid
- static inline _syscall0(gid_t, _dl_getegid);
-
- +#ifdef __NR_getxpid
- +# define __NR_getpid __NR_getxpid
- +#endif
- #define __NR__dl_getpid __NR_getpid
- static inline _syscall0(gid_t, _dl_getpid);
-
- #define __NR__dl_readlink __NR_readlink
- -static inline _syscall3(int, _dl_readlink, const char *, path, char *, buf, size_t, bufsiz);
- +static inline _syscall3(int, _dl_readlink, const char *, path, char *, buf,
- + size_t, bufsiz);
-
- -#ifdef __NR_mmap
- -#ifdef MMAP_HAS_6_ARGS
- -#define __NR__dl_mmap __NR_mmap
- -static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
- - int, prot, int, flags, int, fd, off_t, offset);
- +#ifdef __UCLIBC_HAS_SSP__
- +# include <sys/time.h>
- +# define __NR__dl_gettimeofday __NR_gettimeofday
- +static inline _syscall2(int, _dl_gettimeofday, struct timeval *, tv,
- +# ifdef __USE_BSD
- + struct timezone *, tz);
- +# else
- + void *, tz);
- +# endif
- +#endif
- +
- +
- +/* handle all the fun mmap intricacies */
- +#if (defined(__UCLIBC_MMAP_HAS_6_ARGS__) && defined(__NR_mmap)) || !defined(__NR_mmap2)
- +# define _dl_MAX_ERRNO 4096
- +# define _dl_mmap_check_error(__res) \
- + (((long)__res) < 0 && ((long)__res) >= -_dl_MAX_ERRNO)
- #else
- -#define __NR__dl_mmap_real __NR_mmap
- -static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
- +# define MAP_FAILED ((void *) -1)
- +# define _dl_mmap_check_error(X) (((void *)X) == MAP_FAILED)
- +#endif
- +
- +/* first try mmap(), syscall6() style */
- +#if defined(__UCLIBC_MMAP_HAS_6_ARGS__) && defined(__NR_mmap)
- +
- +# define __NR__dl_mmap __NR_mmap
- +static inline _syscall6(void *, _dl_mmap, void *, start, size_t, length,
- + int, prot, int, flags, int, fd, off_t, offset);
- +
- +/* then try mmap2() */
- +#elif defined(__NR_mmap2)
- +
- +# define __NR___syscall_mmap2 __NR_mmap2
- +static inline _syscall6(__ptr_t, __syscall_mmap2, __ptr_t, addr, size_t, len,
- + int, prot, int, flags, int, fd, off_t, offset);
- +
- +/* Some architectures always use 12 as page shift for mmap2() eventhough the
- + * real PAGE_SHIFT != 12. Other architectures use the same value as
- + * PAGE_SHIFT...
- + */
- +#ifndef MMAP2_PAGE_SHIFT
- +# define MMAP2_PAGE_SHIFT 12
- +#endif
-
- static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
- - int flags, int fd, unsigned long offset)
- + int flags, int fd, unsigned long offset)
- +{
- + if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1))
- + return MAP_FAILED;
- + return __syscall_mmap2(addr, size, prot, flags,
- + fd, (off_t) (offset >> MMAP2_PAGE_SHIFT));
- +}
- +
- +/* finally, fall back to mmap(), syscall1() style */
- +#elif defined(__NR_mmap)
- +
- +# define __NR__dl_mmap_real __NR_mmap
- +static inline _syscall1(void *, _dl_mmap_real, unsigned long *, buffer);
- +static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
- + int flags, int fd, unsigned long offset)
- {
- unsigned long buffer[6];
-
- @@ -125,24 +190,9 @@
- buffer[5] = (unsigned long) offset;
- return (void *) _dl_mmap_real(buffer);
- }
- -#endif
- -#elif defined __NR_mmap2
- -#define __NR___syscall_mmap2 __NR_mmap2
- -static inline _syscall6(__ptr_t, __syscall_mmap2, __ptr_t, addr,
- - size_t, len, int, prot, int, flags, int, fd, off_t, offset);
- -/*always 12, even on architectures where PAGE_SHIFT != 12 */
- -#define MMAP2_PAGE_SHIFT 12
- -static inline void * _dl_mmap(void * addr, unsigned long size, int prot,
- - int flags, int fd, unsigned long offset)
- -{
- - if (offset & ((1 << MMAP2_PAGE_SHIFT) - 1))
- - return MAP_FAILED;
- - return(__syscall_mmap2(addr, size, prot, flags,
- - fd, (off_t) (offset >> MMAP2_PAGE_SHIFT)));
- -}
- +
- #else
- -#error "Your architecture doesn't seem to provide mmap() !?"
- +# error "Your architecture doesn't seem to provide mmap() !?"
- #endif
-
- #endif /* _LD_SYSCALL_H_ */
- -
- diff -urN uClibc-0.9.28.orig/ldso/include/dlfcn.h uClibc-0.9.28/ldso/include/dlfcn.h
- --- uClibc-0.9.28.orig/ldso/include/dlfcn.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/dlfcn.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,3 +1,10 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- /* User functions for run-time dynamic loading. libdl version */
- #ifndef _DLFCN_H
- #define _DLFCN_H 1
- diff -urN uClibc-0.9.28.orig/ldso/include/ldso.h uClibc-0.9.28/ldso/include/ldso.h
- --- uClibc-0.9.28.orig/ldso/include/ldso.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/ldso.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,3 +1,10 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- #ifndef _LDSO_H_
- #define _LDSO_H_
-
- @@ -20,13 +27,15 @@
- /* Pull in compiler and arch stuff */
- #include <stdlib.h>
- #include <stdarg.h>
- +#include <bits/wordsize.h>
- /* Pull in the arch specific type information */
- #include <sys/types.h>
- +/* Pull in the arch specific page size */
- +#include <bits/uClibc_page.h>
- +#define attribute_unused __attribute__ ((unused))
- /* Pull in the ldso syscalls and string functions */
- #include <dl-syscall.h>
- #include <dl-string.h>
- -/* Pull in the arch specific page size */
- -#include <bits/uClibc_page.h>
- /* Now the ldso specific headers */
- #include <dl-elf.h>
- #include <dl-hash.h>
- diff -urN uClibc-0.9.28.orig/ldso/include/unsecvars.h uClibc-0.9.28/ldso/include/unsecvars.h
- --- uClibc-0.9.28.orig/ldso/include/unsecvars.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/include/unsecvars.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,3 +1,10 @@
- +/* vi: set sw=4 ts=4: */
- +/*
- + * Copyright (C) 2000-2005 by Erik Andersen <andersen@codepoet.org>
- + *
- + * GNU Lesser General Public License version 2.1 or later.
- + */
- +
- /*
- * Environment variable to be removed for SUID programs. The names are all
- * stuffed in a single string which means they have to be terminated with a
- @@ -5,22 +12,21 @@
- */
-
- #define UNSECURE_ENVVARS \
- - "LD_AOUT_PRELOAD\0" \
- - "LD_AOUT_LIBRARY_PATH\0" \
- "LD_PRELOAD\0" \
- "LD_LIBRARY_PATH\0" \
- "LD_DEBUG\0" \
- "LD_DEBUG_OUTPUT\0" \
- "LD_TRACE_LOADED_OBJECTS\0" \
- - "HOSTALIASES\0" \
- - "LOCALDOMAIN\0" \
- - "RES_OPTIONS\0" \
- "TMPDIR\0"
-
- /*
- + * LD_TRACE_LOADED_OBJECTS is not in glibc-2.3.5's unsecvars.h
- + * though used by ldd
- + *
- * These environment variables are defined by glibc but ignored in
- * uClibc, but may very well have an equivalent in uClibc.
- *
- - * MALLOC_TRACE, RESOLV_HOST_CONF, TZDIR, GCONV_PATH, LD_USE_LOAD_BIAS,
- - * LD_PROFILE, LD_ORIGIN_PATH, LOCPATH, NLSPATH
- + * LD_ORIGIN_PATH, LD_PROFILE, LD_USE_LOAD_BIAS, LD_DYNAMIC_WEAK, LD_SHOW_AUXV,
- + * GCONV_PATH, GETCONF_DIR, HOSTALIASES, LOCALDOMAIN, LOCPATH, MALLOC_TRACE,
- + * NLSPATH, RESOLV_HOST_CONF, RES_OPTIONS, TZDIR
- */
- diff -urN uClibc-0.9.28.orig/ldso/ldso/Makefile uClibc-0.9.28/ldso/ldso/Makefile
- --- uClibc-0.9.28.orig/ldso/ldso/Makefile 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/Makefile 2006-04-28 00:14:35.000000000 -0600
- @@ -42,7 +42,9 @@
- endif
- XXFLAGS+= -DUCLIBC_LDSO=\"$(UCLIBC_LDSO)\" $(XARCH_CFLAGS) $(CPU_CFLAGS) $(PICFLAG) \
- -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \
- - -fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)ldso/include -I. -I$(TOPDIR)include
- + -fno-builtin -nostdinc -D_LIBC \
- + -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\" \
- + -I$(TOPDIR)ldso/ldso/$(TARGET_ARCH) -I$(TOPDIR)ldso/include -I$(TOPDIR)ldso/ldso -I$(TOPDIR)include
-
- # BEWARE!!! At least mips* will die if -O0 is used!!!
- XXFLAGS:=$(XXFLAGS:-O0=-O1)
- diff -urN uClibc-0.9.28.orig/ldso/ldso/arm/dl-startup.h uClibc-0.9.28/ldso/ldso/arm/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/arm/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/arm/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,10 +1,15 @@
- /* vi: set sw=4 ts=4: */
- /*
- * Architecture specific code used by dl-startup.c
- - * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
- + * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
- + *
- + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
- */
-
- -asm(
- +#include <features.h>
- +
- +#if !defined(__thumb__)
- +__asm__(
- " .text\n"
- " .globl _start\n"
- " .type _start,%function\n"
- @@ -40,7 +45,78 @@
- " ldr r0, .L_FINI_PROC\n"
- " ldr r0, [sl, r0]\n"
- " @ jump to the user_s entry point\n"
- +#if defined(__USE_BX__)
- + " bx r6\n"
- +#else
- + " mov pc, r6\n"
- +#endif
- + ".L_GET_GOT:\n"
- + " .word _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n"
- + ".L_SKIP_ARGS:\n"
- + " .word _dl_skip_args(GOTOFF)\n"
- + ".L_FINI_PROC:\n"
- + " .word _dl_fini(GOT)\n"
- + "\n\n"
- + " .size _start,.-_start\n"
- + ".previous\n"
- +);
- +#else
- +__asm__(
- + " .text\n"
- + " .arm\n"
- + " .globl _start\n"
- + " .type _start,%function\n"
- + "_start:\n"
- + " @ dumb: can't persuade the linker to make the start address\n"
- + " @ odd, so use an arm function and change to thumb (_dl_start\n"
- + " @ is thumb)\n"
- + " adr r0, __dl_thumb_start+1\n"
- + " bx r0\n"
- + "\n\n"
- + " .thumb\n"
- + " .globl __dl_thumb_start\n"
- + " .thumb_func\n"
- + " .type __dl_thumb_start,%function\n"
- + "__dl_thumb_start:\n"
- + " @ at start time, all the args are on the stack\n"
- + " mov r0, sp\n"
- + " bl _dl_start\n"
- + " @ returns user entry point in r0\n"
- + " mov r6, r0\n"
- + " @ we are PIC code, so get global offset table\n"
- + " ldr r7, .L_GET_GOT\n"
- + ".L_GOT_GOT:\n"
- + " add r7, pc\n"
- + " @ See if we were run as a command with the executable file\n"
- + " @ name as an extra leading argument.\n"
- + " ldr r4, .L_SKIP_ARGS\n"
- + " ldr r4, [r7, r4]\n"
- + " @ get the original arg count\n"
- + " ldr r1, [sp]\n"
- + " @ subtract _dl_skip_args from it\n"
- + " sub r1, r1, r4\n"
- + " @ adjust the stack pointer to skip them\n"
- + " lsl r4, r4, #2\n"
- + " add sp, r4\n"
- + " @ get the argv address\n"
- + " add r2, sp, #4\n"
- + " @ store the new argc in the new stack location\n"
- + " str r1, [sp]\n"
- + " @ compute envp\n"
- + " lsl r3, r1, #2\n"
- + " add r3, r3, r2\n"
- + " add r3, #4\n"
- + "\n\n"
- + " @ load the finalizer function\n"
- + " ldr r0, .L_FINI_PROC\n"
- + " ldr r0, [r7, r0]\n"
- + " @ jump to the user_s entry point\n"
- +#if defined(__USE_BX__)
- + " bx r6\n"
- +#else
- " mov pc, r6\n"
- +#endif
- + "\n\n"
- ".L_GET_GOT:\n"
- " .word _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4\n"
- ".L_SKIP_ARGS:\n"
- @@ -51,6 +127,7 @@
- " .size _start,.-_start\n"
- ".previous\n"
- );
- +#endif
-
-
- /* Get a pointer to the argv array. On many platforms this can be just
- @@ -115,9 +192,3 @@
- _dl_exit(1);
- }
- }
- -
- -
- -/* Transfer control to the user's application, once the dynamic loader is
- - * done. This routine has to exit the current function, then call the
- - * _dl_elf_main function. */
- -#define START() return _dl_elf_main;
- diff -urN uClibc-0.9.28.orig/ldso/ldso/arm/dl-syscalls.h uClibc-0.9.28/ldso/ldso/arm/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/arm/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/arm/dl-syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,6 +1,7 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
-
- diff -urN uClibc-0.9.28.orig/ldso/ldso/arm/dl-sysdep.h uClibc-0.9.28/ldso/ldso/arm/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/arm/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/arm/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -43,6 +43,7 @@
- return m;
- }
- #define do_rem(result, n, base) ((result) = arm_modulus(n, base))
- +#define do_div_10(result, remain) ((result) = (((result) - (remain)) / 2) * -(-1ul / 5ul))
-
- /* Here we define the magic numbers that this dynamic loader should accept */
- #define MAGIC1 EM_ARM
- @@ -85,7 +86,25 @@
- extern void __dl_start asm ("_dl_start");
- Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
- Elf32_Addr pcrel_addr;
- +#if !defined __thumb__
- asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
- +#else
- + int tmp;
- + /* The above adr will not work on thumb because it
- + * is negative. The only safe way is to temporarily
- + * swap to arm.
- + */
- + asm( ".align 2\n"
- + " bx pc\n"
- + " nop \n"
- + " .arm \n"
- + " adr %0, _dl_start\n"
- + " .align 2\n"
- + " orr %1, pc, #1\n"
- + " bx %1\n"
- + " .force_thumb\n"
- + : "=r" (pcrel_addr), "=&r" (tmp));
- +#endif
- return pcrel_addr - got_addr;
- }
-
- diff -urN uClibc-0.9.28.orig/ldso/ldso/arm/elfinterp.c uClibc-0.9.28/ldso/ldso/arm/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/arm/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/arm/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -38,6 +38,8 @@
- a more than adequate job of explaining everything required to get this
- working. */
-
- +#include "ldso.h"
- +
- extern int _dl_linux_resolve(void);
-
- unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
- @@ -63,7 +65,6 @@
- strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
- symname = strtab + symtab[symtab_index].st_name;
-
- -
- if (unlikely(reloc_type != R_ARM_JUMP_SLOT)) {
- _dl_dprintf(2, "%s: Incorrect relocation type in jump relocations\n",
- _dl_progname);
- diff -urN uClibc-0.9.28.orig/ldso/ldso/cris/dl-startup.h uClibc-0.9.28/ldso/ldso/cris/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/cris/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/cris/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -4,22 +4,43 @@
-
- /* This code fixes the stack pointer so that the dynamic linker
- * can find argc, argv and auxvt (Auxillary Vector Table). */
- +#ifdef __arch_v32
- +
- +asm("" \
- +" .text\n" \
- +" .globl _start\n" \
- +" .type _start,@function\n" \
- +"_start:\n" \
- +" move.d $sp,$r10\n" \
- +" lapc _dl_start,$r9\n" \
- +" jsr $r9\n" \
- +" nop\n" \
- +" moveq 0,$r8\n" \
- +" jump $r10\n" \
- +" move $r8,$srp\n" \
- +" .size _start,.-_start\n" \
- +" .previous\n" \
- +);
- +
- +#else
- +
- asm("" \
- " .text\n" \
- " .globl _start\n" \
- " .type _start,@function\n" \
- "_start:\n" \
- -" move.d $sp,$r10\n" \
- -" move.d $pc,$r9\n" \
- -" add.d _dl_start - ., $r9\n" \
- -" jsr $r9\n" \
- -" moveq 0,$r8\n" \
- -" move $r8,$srp\n" \
- -" jump $r10\n" \
- +" move.d $sp,$r10\n" \
- +" move.d $pc,$r9\n" \
- +" add.d _dl_start - ., $r9\n" \
- +" jsr $r9\n" \
- +" moveq 0,$r8\n" \
- +" move $r8,$srp\n" \
- +" jump $r10\n" \
- " .size _start,.-_start\n" \
- " .previous\n" \
- );
-
- +#endif /* __arch_v32 */
-
- /* Get a pointer to the argv array. On many platforms this can be just
- * the address if the first argument, on other platforms we need to
- @@ -58,8 +79,3 @@
- break;
- }
- }
- -
- -/* Transfer control to the user's application, once the dynamic loader is
- - * done. This routine has to exit the current function, then call the
- - * _dl_elf_main function. */
- -#define START() return _dl_elf_main
- diff -urN uClibc-0.9.28.orig/ldso/ldso/cris/dl-syscalls.h uClibc-0.9.28/ldso/ldso/cris/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/cris/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/cris/dl-syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,5 +1,6 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
- diff -urN uClibc-0.9.28.orig/ldso/ldso/cris/dl-sysdep.h uClibc-0.9.28/ldso/ldso/cris/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/cris/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/cris/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -18,8 +18,6 @@
- struct elf_resolve;
- extern unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry);
-
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 8192 bytes alignment */
- #define PAGE_ALIGN 0xffffe000
- #define ADDR_ALIGN 0x1fff
- @@ -68,8 +66,32 @@
- {
- Elf32_Addr gotaddr_diff;
-
- +#ifdef __arch_v32
- + extern char ___CRISv32_dummy[] __asm__ ("_dl_start");
- +
- + __asm__ ("addo.w _dl_start:GOT16,$r0,$acr\n\t"
- + "lapc _dl_start,%0\n\t"
- + "sub.d [$acr],%0"
- + /* For v32, we need to force GCC to have R0 loaded with
- + _GLOBAL_OFFSET_TABLE_ at this point, which might not
- + otherwise have happened in the caller. (For v10, it's
- + loaded for non-global variables too, so we don't need
- + anything special there.) We accomplish this by faking the
- + address of a global variable (as seen by GCC) as input to
- + the asm; that address calculation goes through the GOT.
- + Use of this function happens before we've filled in the
- + GOT, so the address itself will not be correctly
- + calculated, therefore we don't use any symbol whose
- + address may be re-used later on. Let's just reuse the
- + _dl_start symbol, faking it as a global by renaming it as
- + another variable through an asm. */
- + : "=r" (gotaddr_diff)
- + : "g" (___CRISv32_dummy)
- + : "acr");
- +#else
- __asm__ ("sub.d [$r0+_dl_start:GOT16],$r0,%0\n\t"
- "add.d _dl_start:GOTOFF,%0" : "=r" (gotaddr_diff));
- +#endif
- return gotaddr_diff;
- }
-
- diff -urN uClibc-0.9.28.orig/ldso/ldso/cris/resolve.S uClibc-0.9.28/ldso/ldso/cris/resolve.S
- --- uClibc-0.9.28.orig/ldso/ldso/cris/resolve.S 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/cris/resolve.S 2006-04-28 00:14:35.000000000 -0600
- @@ -17,33 +17,73 @@
- .globl _dl_linux_resolve
- .type _dl_linux_resolve,@function
-
- +#ifdef __arch_v32
- +
- +_dl_linux_resolve:
- + subq 4,$sp
- + move.d $r0,[$sp]
- + subq 4,$sp
- + move.d $r13,[$sp]
- + subq 4,$sp
- + move.d $r12,[$sp]
- + subq 4,$sp
- + move.d $r11,[$sp]
- + subq 4,$sp
- + addoq 5*4,$sp,$acr
- + move.d $r10,[$sp]
- + subq 4,$sp
- + move $mof,$r10
- + move.d $r9,[$sp]
- + subq 4,$sp
- + move.d [$acr],$r11
- + move $srp,[$sp]
- + lapc _GLOBAL_OFFSET_TABLE_,$r0
- + move.d _dl_linux_resolver:PLTG,$r9
- + add.d $r0,$r9
- + jsr $r9
- + nop
- + move.d $r10,$acr
- + move [$sp+],$srp
- + move.d [$sp+],$r9
- + move.d [$sp+],$r10
- + move.d [$sp+],$r11
- + move.d [$sp+],$r12
- + move.d [$sp+],$r13
- + move.d [$sp+],$r0
- + jump $acr
- + addq 4,$sp
- +
- +#else
- +
- _dl_linux_resolve:
- - push $r13
- - push $r12
- - push $r11
- - push $r10
- - push $r9
- - push $r0
- - push $srp
- - move.d [$sp+7*4],$r11
- - move $mof,$r10
- + push $r13
- + push $r12
- + push $r11
- + push $r10
- + push $r9
- + push $r0
- + push $srp
- + move.d [$sp+7*4],$r11
- + move $mof,$r10
- #ifdef __PIC__
- - move.d $pc,$r0
- - sub.d .:GOTOFF,$r0
- - move.d _dl_linux_resolver:PLTG,$r9
- - add.d $r0,$r9
- - jsr $r9
- + move.d $pc,$r0
- + sub.d .:GOTOFF,$r0
- + move.d _dl_linux_resolver:PLTG,$r9
- + add.d $r0,$r9
- + jsr $r9
- #else
- - jsr _dl_linux_resolver
- + jsr _dl_linux_resolver
- #endif
- - move.d $r10,[$sp+7*4]
- - pop $srp
- - pop $r0
- - pop $r9
- - pop $r10
- - pop $r11
- - pop $r12
- - pop $r13
- - jump [$sp+]
- + move.d $r10,[$sp+7*4]
- + pop $srp
- + pop $r0
- + pop $r9
- + pop $r10
- + pop $r11
- + pop $r12
- + pop $r13
- + jump [$sp+]
- +
- +#endif /* __arch_v32 */
-
- .size _dl_linux_resolve, . - _dl_linux_resolve
- diff -urN uClibc-0.9.28.orig/ldso/ldso/dl-elf.c uClibc-0.9.28/ldso/ldso/dl-elf.c
- --- uClibc-0.9.28.orig/ldso/ldso/dl-elf.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/dl-elf.c 2006-05-02 13:50:58.000000000 -0600
- @@ -3,7 +3,7 @@
- * This file contains the helper routines to load an ELF shared
- * library into memory and add the symbol table info to the chain.
- *
- - * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
- + * Copyright (C) 2000-2006 by Erik Andersen <andersen@codepoet.org>
- * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald,
- * David Engel, Hongjiu Lu and Mitch D'Souza
- *
- @@ -60,8 +60,8 @@
- _dl_cache_addr = (caddr_t) _dl_mmap(0, _dl_cache_size, PROT_READ, MAP_SHARED, fd, 0);
- _dl_close(fd);
- if (_dl_mmap_check_error(_dl_cache_addr)) {
- - _dl_dprintf(2, "%s: can't map cache '%s'\n",
- - _dl_progname, LDSO_CACHE);
- + _dl_dprintf(2, "%s:%i: can't map '%s'\n",
- + _dl_progname, __LINE__, LDSO_CACHE);
- return -1;
- }
-
- @@ -115,7 +115,7 @@
- #endif
-
-
- -void
- +void
- _dl_protect_relro (struct elf_resolve *l)
- {
- ElfW(Addr) start = ((l->loadaddr + l->relro_addr)
- @@ -136,27 +136,41 @@
- search_for_named_library(const char *name, int secure, const char *path_list,
- struct dyn_elf **rpnt)
- {
- - char *path, *path_n;
- - char mylibname[2050];
- + char *path, *path_n, *mylibname;
- struct elf_resolve *tpnt;
- - int done = 0;
- + int done;
-
- if (path_list==NULL)
- return NULL;
-
- - /* We need a writable copy of this string */
- - path = _dl_strdup(path_list);
- - if (!path) {
- + /* We need a writable copy of this string, but we don't
- + * need this allocated permanently since we don't want
- + * to leak memory, so use alloca to put path on the stack */
- + done = _dl_strlen(path_list);
- + path = alloca(done + 1);
- +
- + /* another bit of local storage */
- + mylibname = alloca(2050);
- +
- + /* gcc inlines alloca using a single instruction adjusting
- + * the stack pointer and no stack overflow check and thus
- + * no NULL error return. No point leaving in dead code... */
- +#if 0
- + if (!path || !mylibname) {
- _dl_dprintf(2, "Out of memory!\n");
- _dl_exit(0);
- }
- +#endif
- +
- + _dl_memcpy(path, path_list, done+1);
-
- /* Unlike ldd.c, don't bother to eliminate double //s */
-
- /* Replace colons with zeros in path_list */
- /* : at the beginning or end of path maps to CWD */
- /* :: anywhere maps CWD */
- - /* "" maps to CWD */
- + /* "" maps to CWD */
- + done = 0;
- path_n = path;
- do {
- if (*path == 0) {
- @@ -180,71 +194,6 @@
- return NULL;
- }
-
- -/* Check if the named library is already loaded... */
- -struct elf_resolve *_dl_check_if_named_library_is_loaded(const char *full_libname,
- - int trace_loaded_objects)
- -{
- - const char *pnt, *pnt1;
- - struct elf_resolve *tpnt1;
- - const char *libname, *libname2;
- - static const char libc[] = "libc.so.";
- - static const char aborted_wrong_lib[] = "%s: aborted attempt to load %s!\n";
- -
- - pnt = libname = full_libname;
- -
- - _dl_if_debug_dprint("Checking if '%s' is already loaded\n", full_libname);
- - /* quick hack to ensure mylibname buffer doesn't overflow. don't
- - allow full_libname or any directory to be longer than 1024. */
- - if (_dl_strlen(full_libname) > 1024)
- - return NULL;
- -
- - /* Skip over any initial initial './' and '/' stuff to
- - * get the short form libname with no path garbage */
- - pnt1 = _dl_strrchr(pnt, '/');
- - if (pnt1) {
- - libname = pnt1 + 1;
- - }
- -
- - /* Make sure they are not trying to load the wrong C library!
- - * This sometimes happens esp with shared libraries when the
- - * library path is somehow wrong! */
- -#define isdigit(c) (c >= '0' && c <= '9')
- - if ((_dl_strncmp(libname, libc, 8) == 0) && _dl_strlen(libname) >=8 &&
- - isdigit(libname[8]))
- - {
- - /* Abort attempts to load glibc, libc5, etc */
- - if ( libname[8]!='0') {
- - if (!trace_loaded_objects) {
- - _dl_dprintf(2, aborted_wrong_lib, libname, _dl_progname);
- - _dl_exit(1);
- - }
- - return NULL;
- - }
- - }
- -
- - /* Critical step! Weed out duplicates early to avoid
- - * function aliasing, which wastes memory, and causes
- - * really bad things to happen with weaks and globals. */
- - for (tpnt1 = _dl_loaded_modules; tpnt1; tpnt1 = tpnt1->next) {
- -
- - /* Skip over any initial initial './' and '/' stuff to
- - * get the short form libname with no path garbage */
- - libname2 = tpnt1->libname;
- - pnt1 = _dl_strrchr(libname2, '/');
- - if (pnt1) {
- - libname2 = pnt1 + 1;
- - }
- -
- - if (_dl_strcmp(libname2, libname) == 0) {
- - /* Well, that was certainly easy */
- - return tpnt1;
- - }
- - }
- -
- - return NULL;
- -}
- -
- -
- /* Used to return error codes back to dlopen et. al. */
- unsigned long _dl_error_number;
- unsigned long _dl_internal_error_number;
- @@ -271,14 +220,6 @@
- libname = pnt + 1;
- }
-
- - /* Critical step! Weed out duplicates early to avoid
- - * function aliasing, which wastes memory, and causes
- - * really bad things to happen with weaks and globals. */
- - if ((tpnt1=_dl_check_if_named_library_is_loaded(libname, trace_loaded_objects))!=NULL) {
- - tpnt1->usage_count++;
- - return tpnt1;
- - }
- -
- _dl_if_debug_dprint("\tfind library='%s'; searching\n", libname);
- /* If the filename has any '/', try it straight and leave it at that.
- For IBCS2 compatibility under linux, we substitute the string
- @@ -290,7 +231,6 @@
- if (tpnt1) {
- return tpnt1;
- }
- - //goto goof;
- }
-
- /*
- @@ -411,56 +351,45 @@
- int i, flags, piclib, infile;
- ElfW(Addr) relro_addr = 0;
- size_t relro_size = 0;
- -
- - /* If this file is already loaded, skip this step */
- - tpnt = _dl_check_hashed_files(libname);
- - if (tpnt) {
- - if (*rpnt) {
- - (*rpnt)->next = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf));
- - _dl_memset((*rpnt)->next, 0, sizeof(struct dyn_elf));
- - (*rpnt)->next->prev = (*rpnt);
- - *rpnt = (*rpnt)->next;
- - (*rpnt)->dyn = tpnt;
- - tpnt->symbol_scope = _dl_symbol_tables;
- - }
- - tpnt->usage_count++;
- - tpnt->libtype = elf_lib;
- - _dl_if_debug_dprint("file='%s'; already loaded\n", libname);
- - return tpnt;
- - }
- -
- - /* If we are in secure mode (i.e. a setu/gid binary using LD_PRELOAD),
- - we don't load the library if it isn't setuid. */
- -
- - if (secure) {
- - struct stat st;
- -
- - if (_dl_stat(libname, &st) || !(st.st_mode & S_ISUID))
- - return NULL;
- - }
- + struct stat st;
-
- libaddr = 0;
- infile = _dl_open(libname, O_RDONLY, 0);
- if (infile < 0) {
- -#if 0
- - /*
- - * NO! When we open shared libraries we may search several paths.
- - * it is inappropriate to generate an error here.
- - */
- - _dl_dprintf(2, "%s: can't open '%s'\n", _dl_progname, libname);
- -#endif
- _dl_internal_error_number = LD_ERROR_NOFILE;
- return NULL;
- }
-
- + if (_dl_fstat(infile, &st) < 0) {
- + _dl_internal_error_number = LD_ERROR_NOFILE;
- + _dl_close(infile);
- + return NULL;
- + }
- + /* If we are in secure mode (i.e. a setu/gid binary using LD_PRELOAD),
- + we don't load the library if it isn't setuid. */
- + if (secure)
- + if (!(st.st_mode & S_ISUID)) {
- + _dl_close(infile);
- + return NULL;
- + }
- +
- + /* Check if file is already loaded */
- + for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
- + if(tpnt->st_dev == st.st_dev && tpnt->st_ino == st.st_ino) {
- + /* Already loaded */
- + tpnt->usage_count++;
- + _dl_close(infile);
- + return tpnt;
- + }
- + }
- header = _dl_mmap((void *) 0, _dl_pagesize, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (_dl_mmap_check_error(header)) {
- - _dl_dprintf(2, "%s: can't map '%s'\n", _dl_progname, libname);
- + _dl_dprintf(2, "%s:%i: can't map '%s'\n", _dl_progname, __LINE__, libname);
- _dl_internal_error_number = LD_ERROR_MMAP_FAILED;
- _dl_close(infile);
- return NULL;
- - };
- + }
-
- _dl_read(infile, header, _dl_pagesize);
- epnt = (ElfW(Ehdr) *) (intptr_t) header;
- @@ -475,7 +404,7 @@
- _dl_close(infile);
- _dl_munmap(header, _dl_pagesize);
- return NULL;
- - };
- + }
-
- if ((epnt->e_type != ET_DYN) || (epnt->e_machine != MAGIC1
- #ifdef MAGIC2
- @@ -490,7 +419,7 @@
- _dl_close(infile);
- _dl_munmap(header, _dl_pagesize);
- return NULL;
- - };
- + }
-
- ppnt = (ElfW(Phdr) *)(intptr_t) & header[epnt->e_phoff];
-
- @@ -502,7 +431,7 @@
- _dl_dprintf(2, "%s: '%s' has more than one dynamic section\n",
- _dl_progname, libname);
- dynamic_addr = ppnt->p_vaddr;
- - };
- + }
-
- if (ppnt->p_type == PT_LOAD) {
- /* See if this is a PIC library. */
- @@ -518,7 +447,7 @@
- }
- }
- ppnt++;
- - };
- + }
-
- maxvma = (maxvma + ADDR_ALIGN) & ~ADDR_ALIGN;
- minvma = minvma & ~0xffffU;
- @@ -530,12 +459,12 @@
- status = (char *) _dl_mmap((char *) (piclib ? 0 : minvma),
- maxvma - minvma, PROT_NONE, flags | MAP_ANONYMOUS, -1, 0);
- if (_dl_mmap_check_error(status)) {
- - _dl_dprintf(2, "%s: can't map %s\n", _dl_progname, libname);
- + _dl_dprintf(2, "%s:%i: can't map '%s'\n", _dl_progname, __LINE__, libname);
- _dl_internal_error_number = LD_ERROR_MMAP_FAILED;
- _dl_close(infile);
- _dl_munmap(header, _dl_pagesize);
- return NULL;
- - };
- + }
- libaddr = (unsigned long) status;
- flags |= MAP_FIXED;
-
- @@ -567,14 +496,14 @@
- ppnt->p_offset & OFFS_ALIGN);
-
- if (_dl_mmap_check_error(status)) {
- - _dl_dprintf(2, "%s: can't map '%s'\n",
- - _dl_progname, libname);
- + _dl_dprintf(2, "%s:%i: can't map '%s'\n",
- + _dl_progname, __LINE__, libname);
- _dl_internal_error_number = LD_ERROR_MMAP_FAILED;
- _dl_munmap((char *) libaddr, maxvma - minvma);
- _dl_close(infile);
- _dl_munmap(header, _dl_pagesize);
- return NULL;
- - };
- + }
-
- /* Pad the last page with zeroes. */
- cpnt = (char *) (status + (ppnt->p_vaddr & ADDR_ALIGN) +
- @@ -601,21 +530,21 @@
- ppnt->p_filesz, LXFLAGS(ppnt->p_flags), flags,
- infile, ppnt->p_offset & OFFS_ALIGN);
- if (_dl_mmap_check_error(status)) {
- - _dl_dprintf(2, "%s: can't map '%s'\n", _dl_progname, libname);
- + _dl_dprintf(2, "%s:%i: can't map '%s'\n", _dl_progname, __LINE__, libname);
- _dl_internal_error_number = LD_ERROR_MMAP_FAILED;
- _dl_munmap((char *) libaddr, maxvma - minvma);
- _dl_close(infile);
- _dl_munmap(header, _dl_pagesize);
- return NULL;
- - };
- + }
-
- /* if(libaddr == 0 && piclib) {
- libaddr = (unsigned long) status;
- flags |= MAP_FIXED;
- - }; */
- - };
- + } */
- + }
- ppnt++;
- - };
- + }
- _dl_close(infile);
-
- /* For a non-PIC library, the addresses are all absolute */
- @@ -665,6 +594,8 @@
- dynamic_addr, 0);
- tpnt->relro_addr = relro_addr;
- tpnt->relro_size = relro_size;
- + tpnt->st_dev = st.st_dev;
- + tpnt->st_ino = st.st_ino;
- tpnt->ppnt = (ElfW(Phdr) *)(intptr_t) (tpnt->loadaddr + epnt->e_phoff);
- tpnt->n_phent = epnt->e_phnum;
-
- @@ -693,7 +624,7 @@
- if (lpnt) {
- lpnt = (unsigned long *) (dynamic_info[DT_PLTGOT]);
- INIT_GOT(lpnt, tpnt);
- - };
- + }
-
- _dl_if_debug_dprint("\n\tfile='%s'; generating link map\n", libname);
- _dl_if_debug_dprint("\t\tdynamic: %x base: %x\n", dynamic_addr, libaddr);
- @@ -714,10 +645,12 @@
- ElfW(Addr) reloc_addr;
-
- if (rpnt->next)
- - goof += _dl_fixup(rpnt->next, now_flag);
- + goof = _dl_fixup(rpnt->next, now_flag);
- + if (goof)
- + return goof;
- tpnt = rpnt->dyn;
-
- - if(!(tpnt->init_flag & RELOCS_DONE))
- + if(!(tpnt->init_flag & RELOCS_DONE))
- _dl_if_debug_dprint("relocation processing: %s\n", tpnt->libname);
-
- if (unlikely(tpnt->dynamic_info[UNSUPPORTED_RELOC_TYPE])) {
- @@ -735,7 +668,6 @@
- #endif
- if (tpnt->dynamic_info[DT_RELOC_TABLE_ADDR] &&
- !(tpnt->init_flag & RELOCS_DONE)) {
- - tpnt->init_flag |= RELOCS_DONE;
- reloc_addr = tpnt->dynamic_info[DT_RELOC_TABLE_ADDR];
- relative_count = tpnt->dynamic_info[DT_RELCONT_IDX];
- if (relative_count) { /* Optimize the XX_RELATIVE relocations if possible */
- @@ -746,14 +678,14 @@
- goof += _dl_parse_relocation_information(rpnt,
- reloc_addr,
- reloc_size);
- + tpnt->init_flag |= RELOCS_DONE;
- }
- if (tpnt->dynamic_info[DT_BIND_NOW])
- now_flag = RTLD_NOW;
- if (tpnt->dynamic_info[DT_JMPREL] &&
- (!(tpnt->init_flag & JMP_RELOCS_DONE) ||
- (now_flag && !(tpnt->rtld_flags & now_flag)))) {
- - tpnt->rtld_flags |= now_flag;
- - tpnt->init_flag |= JMP_RELOCS_DONE;
- + tpnt->rtld_flags |= now_flag;
- if (!(tpnt->rtld_flags & RTLD_NOW)) {
- _dl_parse_lazy_relocation_information(rpnt,
- tpnt->dynamic_info[DT_JMPREL],
- @@ -763,6 +695,7 @@
- tpnt->dynamic_info[DT_JMPREL],
- tpnt->dynamic_info[DT_PLTRELSZ]);
- }
- + tpnt->init_flag |= JMP_RELOCS_DONE;
- }
- return goof;
- }
- @@ -770,11 +703,18 @@
- /* Minimal printf which handles only %s, %d, and %x */
- void _dl_dprintf(int fd, const char *fmt, ...)
- {
- - long num;
- +#if __WORDSIZE > 32
- + long int num;
- +#else
- + int num;
- +#endif
- va_list args;
- char *start, *ptr, *string;
- static char *buf;
-
- + if (!fmt)
- + return;
- +
- buf = _dl_mmap((void *) 0, _dl_pagesize, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
- if (_dl_mmap_check_error(buf)) {
- @@ -784,9 +724,6 @@
-
- start = ptr = buf;
-
- - if (!fmt)
- - return;
- -
- if (_dl_strlen(fmt) >= (_dl_pagesize - 1)) {
- _dl_write(fd, "overflow\n", 11);
- _dl_exit(20);
- @@ -818,8 +755,11 @@
- case 'd':
- {
- char tmp[22];
- - num = va_arg(args, long);
- -
- +#if __WORDSIZE > 32
- + num = va_arg(args, long int);
- +#else
- + num = va_arg(args, int);
- +#endif
- string = _dl_simple_ltoa(tmp, num);
- _dl_write(fd, string, _dl_strlen(string));
- break;
- @@ -828,8 +768,11 @@
- case 'X':
- {
- char tmp[22];
- - num = va_arg(args, long);
- -
- +#if __WORDSIZE > 32
- + num = va_arg(args, long int);
- +#else
- + num = va_arg(args, int);
- +#endif
- string = _dl_simple_ltoahex(tmp, num);
- _dl_write(fd, string, _dl_strlen(string));
- break;
- @@ -864,8 +807,10 @@
- {
- __dl_parse_dynamic_info(dpnt, dynamic_info, debug_addr, load_off);
- }
- +
- +/* we want this in ldso.so and libdl.a but nowhere else */
- #ifdef __USE_GNU
- -#if ! defined LIBDL || (! defined PIC && ! defined __PIC__)
- +#if ! defined SHARED || (! defined PIC && ! defined __PIC__)
- int
- __dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info, size_t size, void *data), void *data)
- {
- @@ -884,6 +829,6 @@
- }
- return ret;
- }
- -strong_alias(__dl_iterate_phdr, dl_iterate_phdr);
- +strong_alias(__dl_iterate_phdr, dl_iterate_phdr)
- #endif
- #endif
- diff -urN uClibc-0.9.28.orig/ldso/ldso/dl-hash.c uClibc-0.9.28/ldso/ldso/dl-hash.c
- --- uClibc-0.9.28.orig/ldso/ldso/dl-hash.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/dl-hash.c 2006-04-28 00:14:35.000000000 -0600
- @@ -57,7 +57,7 @@
- /* This is the hash function that is used by the ELF linker to generate the
- * hash table that each executable and library is required to have. We need
- * it to decode the hash table. */
- -static inline Elf32_Word _dl_elf_hash(const char *name)
- +static inline Elf_Symndx _dl_elf_hash(const char *name)
- {
- unsigned long hash=0;
- unsigned long tmp;
- @@ -77,21 +77,6 @@
- return hash;
- }
-
- -/* Check to see if a library has already been added to the hash chain. */
- -struct elf_resolve *_dl_check_hashed_files(const char *libname)
- -{
- - struct elf_resolve *tpnt;
- - int len = _dl_strlen(libname);
- -
- - for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
- - if (_dl_strncmp(tpnt->libname, libname, len) == 0 &&
- - (tpnt->libname[len] == '\0' || tpnt->libname[len] == '.'))
- - return tpnt;
- - }
- -
- - return NULL;
- -}
- -
- /*
- * We call this function when we have just read an ELF library or executable.
- * We add the relevant info to the symbol chain, so that we can resolve all
- @@ -99,9 +84,10 @@
- */
- struct elf_resolve *_dl_add_elf_hash_table(const char *libname,
- char *loadaddr, unsigned long *dynamic_info, unsigned long dynamic_addr,
- + //attribute_unused
- unsigned long dynamic_size)
- {
- - Elf32_Word *hash_addr;
- + Elf_Symndx *hash_addr;
- struct elf_resolve *tpnt;
- int i;
-
- @@ -125,7 +111,7 @@
- tpnt->libtype = loaded_file;
-
- if (dynamic_info[DT_HASH] != 0) {
- - hash_addr = (Elf32_Word*)dynamic_info[DT_HASH];
- + hash_addr = (Elf_Symndx*)dynamic_info[DT_HASH];
- tpnt->nbucket = *hash_addr++;
- tpnt->nchain = *hash_addr++;
- tpnt->elf_buckets = hash_addr;
- diff -urN uClibc-0.9.28.orig/ldso/ldso/dl-startup.c uClibc-0.9.28/ldso/ldso/dl-startup.c
- --- uClibc-0.9.28.orig/ldso/ldso/dl-startup.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/dl-startup.c 2006-04-28 00:14:35.000000000 -0600
- @@ -98,7 +98,7 @@
- int (*_dl_elf_main) (int, char **, char **);
-
- static void* __rtld_stack_end; /* Points to argc on stack, e.g *((long *)__rtld_stackend) == argc */
- -strong_alias(__rtld_stack_end, __libc_stack_end); /* Exported version of __rtld_stack_end */
- +strong_alias(__rtld_stack_end, __libc_stack_end) /* Exported version of __rtld_stack_end */
-
- /* When we enter this piece of code, the program stack looks like this:
- argc argument counter (integer)
- @@ -307,5 +307,11 @@
- SEND_STDERR_DEBUG("transfering control to application @ ");
- _dl_elf_main = (int (*)(int, char **, char **)) auxvt[AT_ENTRY].a_un.a_val;
- SEND_ADDRESS_STDERR_DEBUG(_dl_elf_main, 1);
- +
- +#ifndef START
- + return _dl_elf_main;
- +#else
- +#warning You need to update your arch ldso code
- START();
- +#endif
- }
- diff -urN uClibc-0.9.28.orig/ldso/ldso/frv/dl-syscalls.h uClibc-0.9.28/ldso/ldso/frv/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/frv/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/frv/dl-syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -20,9 +20,10 @@
-
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
- #include <sys/mman.h>
-
- /* The code below is extracted from libc/sysdeps/linux/frv/_mmap.c */
- diff -urN uClibc-0.9.28.orig/ldso/ldso/frv/dl-sysdep.h uClibc-0.9.28/ldso/ldso/frv/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/frv/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/frv/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -65,8 +65,6 @@
-
- extern int _dl_linux_resolve(void) __attribute__((__visibility__("hidden")));
-
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 16KiB page alignment. Should perhaps be made dynamic using
- getpagesize(), based on AT_PAGESZ from auxvt? */
- #define PAGE_ALIGN 0xffffc000
- diff -urN uClibc-0.9.28.orig/ldso/ldso/frv/elfinterp.c uClibc-0.9.28/ldso/ldso/frv/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/frv/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/frv/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -24,7 +24,7 @@
- the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- USA. */
-
- -#include <sys/cdefs.h> /* __attribute_used__ */
- +#include <features.h>
-
- /* Program to load an ELF binary on a linux system, and run it.
- References to symbols in sharable libraries can be resolved by either
- @@ -37,7 +37,7 @@
- a more than adequate job of explaining everything required to get this
- working. */
-
- -struct funcdesc_value volatile *__attribute__((__visibility__("hidden")))
- +struct funcdesc_value volatile attribute_hidden *
- _dl_linux_resolver (struct elf_resolve *tpnt, int reloc_entry)
- {
- int reloc_type;
- diff -urN uClibc-0.9.28.orig/ldso/ldso/i386/dl-startup.h uClibc-0.9.28/ldso/ldso/i386/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/i386/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/i386/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -3,7 +3,7 @@
- * Architecture specific code used by dl-startup.c
- * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
- */
- -asm(
- +__asm__ (
- " .text\n"
- " .align 16\n"
- " .globl _start\n"
- @@ -41,9 +41,9 @@
- #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long*) & ARGS)+1)
-
- /* Handle relocation of the symbols in the dynamic loader. */
- -static inline
- +static __always_inline
- void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
- - unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
- + unsigned long symbol_addr, unsigned long load_addr, attribute_unused Elf32_Sym *symtab)
- {
- switch (ELF32_R_TYPE(rpnt->r_info))
- {
- @@ -64,8 +64,3 @@
- _dl_exit(1);
- }
- }
- -
- -/* Transfer control to the user's application, once the dynamic loader is
- - * done. This routine has to exit the current function, then call the
- - * _dl_elf_main function. */
- -#define START() return _dl_elf_main
- diff -urN uClibc-0.9.28.orig/ldso/ldso/i386/dl-syscalls.h uClibc-0.9.28/ldso/ldso/i386/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/i386/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/i386/dl-syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,5 +1,6 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
- diff -urN uClibc-0.9.28.orig/ldso/ldso/i386/dl-sysdep.h uClibc-0.9.28/ldso/ldso/i386/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/i386/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/i386/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -25,8 +25,6 @@
- struct elf_resolve;
- extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
-
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 4096 bytes alignment */
- #define PAGE_ALIGN 0xfffff000
- #define ADDR_ALIGN 0xfff
- @@ -44,16 +42,18 @@
- /* Return the link-time address of _DYNAMIC. Conveniently, this is the
- first element of the GOT. This must be inlined in a function which
- uses global data. */
- -static inline Elf32_Addr __attribute__ ((unused))
- +static inline Elf32_Addr elf_machine_dynamic (void) attribute_unused;
- +static inline Elf32_Addr
- elf_machine_dynamic (void)
- {
- - register Elf32_Addr *got asm ("%ebx");
- + register Elf32_Addr *got __asm__ ("%ebx");
- return *got;
- }
-
-
- /* Return the run-time load address of the shared object. */
- -static inline Elf32_Addr __attribute__ ((unused))
- +static inline Elf32_Addr elf_machine_load_address (void) attribute_unused;
- +static inline Elf32_Addr
- elf_machine_load_address (void)
- {
- /* It doesn't matter what variable this is, the reference never makes
- @@ -61,7 +61,7 @@
- via the GOT to make sure the compiler initialized %ebx in time. */
- extern int _dl_errno;
- Elf32_Addr addr;
- - asm ("leal _dl_start@GOTOFF(%%ebx), %0\n"
- + __asm__ ("leal _dl_start@GOTOFF(%%ebx), %0\n"
- "subl _dl_start@GOT(%%ebx), %0"
- : "=r" (addr) : "m" (_dl_errno) : "cc");
- return addr;
- diff -urN uClibc-0.9.28.orig/ldso/ldso/i386/elfinterp.c uClibc-0.9.28/ldso/ldso/i386/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/i386/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/i386/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -67,12 +67,6 @@
- strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
- symname = strtab + symtab[symtab_index].st_name;
-
- - if (unlikely(reloc_type != R_386_JMP_SLOT)) {
- - _dl_dprintf(2, "%s: Incorrect relocation type in jump relocations\n",
- - _dl_progname);
- - _dl_exit(1);
- - }
- -
- /* Address of the jump instruction to fix up. */
- instr_addr = ((unsigned long)this_reloc->r_offset +
- (unsigned long)tpnt->loadaddr);
- @@ -81,7 +75,7 @@
- /* Get the address of the GOT entry. */
- new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT);
- if (unlikely(!new_addr)) {
- - _dl_dprintf(2, "%s: Can't resolve symbol '%s'\n", _dl_progname, symname);
- + _dl_dprintf(2, "%s: can't resolve symbol '%s' in lib '%s'.\n", _dl_progname, symname, tpnt->libname);
- _dl_exit(1);
- }
-
- @@ -147,15 +141,15 @@
- int reloc_type = ELF32_R_TYPE(rpnt->r_info);
-
- #if defined (__SUPPORT_LD_DEBUG__)
- - _dl_dprintf(2, "can't handle reloc type %s\n",
- - _dl_reltypes(reloc_type));
- + _dl_dprintf(2, "can't handle reloc type '%s' in lib '%s'\n",
- + _dl_reltypes(reloc_type), tpnt->libname);
- #else
- - _dl_dprintf(2, "can't handle reloc type %x\n",
- - reloc_type);
- + _dl_dprintf(2, "can't handle reloc type %x in lib '%s'\n",
- + reloc_type, tpnt->libname);
- #endif
- - _dl_exit(-res);
- + return res;
- } else if (unlikely(res > 0)) {
- - _dl_dprintf(2, "can't resolve symbol\n");
- + _dl_dprintf(2, "can't resolve symbol in lib '%s'.\n", tpnt->libname);
- return res;
- }
- }
- @@ -191,10 +185,8 @@
- * might have been intentional. We should not be linking local
- * symbols here, so all bases should be covered.
- */
- - if (unlikely(!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) {
- - _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
- - _dl_exit(1);
- - };
- + if (unlikely(!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK))
- + return 1;
- }
-
- #if defined (__SUPPORT_LD_DEBUG__)
- @@ -233,7 +225,7 @@
- }
- break;
- default:
- - return -1; /* Calls _dl_exit(1). */
- + return -1;
- }
-
- #if defined (__SUPPORT_LD_DEBUG__)
- @@ -273,7 +265,7 @@
- *reloc_addr += (unsigned long)tpnt->loadaddr;
- break;
- default:
- - return -1; /* Calls _dl_exit(1). */
- + return -1;
- }
-
- #if defined (__SUPPORT_LD_DEBUG__)
- diff -urN uClibc-0.9.28.orig/ldso/ldso/ldso.c uClibc-0.9.28/ldso/ldso/ldso.c
- --- uClibc-0.9.28.orig/ldso/ldso/ldso.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/ldso.c 2006-05-02 13:55:54.000000000 -0600
- @@ -39,7 +39,7 @@
- #define ALLOW_ZERO_PLTGOT
-
- /* Pull in the value of _dl_progname */
- -#include "dl-progname.h"
- +#include LDSO_ELFINTERP
-
- /* Global variables used within the shared library loader */
- char *_dl_library_path = 0; /* Where we look for libraries */
- @@ -74,7 +74,8 @@
- * can set an internal breakpoint on it, so that we are notified when the
- * address mapping is changed in some way.
- */
- -void _dl_debug_state(void)
- +void _dl_debug_state(void);
- +void _dl_debug_state()
- {
- }
-
- @@ -82,9 +83,78 @@
- static unsigned char *_dl_mmap_zero = 0; /* Also used by _dl_malloc */
-
- static struct elf_resolve **init_fini_list;
- -static int nlist; /* # items in init_fini_list */
- +static unsigned int nlist; /* # items in init_fini_list */
- extern void _start(void);
-
- +#ifdef __UCLIBC_HAS_SSP__
- +#ifndef __UCLIBC_HAS_SSP_COMPAT__
- +#define __UCLIBC_HAS_SSP_COMPAT__ 1
- +#endif
- +# include <dl-osinfo.h>
- +uintptr_t stack_chk_guard;
- +# ifndef THREAD_SET_STACK_GUARD
- +/* Only exported for architectures that don't store the stack guard canary
- + * in local thread area. */
- +uintptr_t __stack_chk_guard attribute_relro;
- +# ifdef __UCLIBC_HAS_SSP_COMPAT__
- +strong_alias(__stack_chk_guard,__guard)
- +# endif
- +# elif __UCLIBC_HAS_SSP_COMPAT__
- +uintptr_t __guard attribute_relro;
- +# endif
- +#endif
- +
- +static void _dl_run_array_forward(unsigned long array, unsigned long size,
- + ElfW(Addr) loadaddr)
- +{
- + if (array != 0) {
- + unsigned int j;
- + unsigned int jm;
- + ElfW(Addr) *addrs;
- + jm = size / sizeof (ElfW(Addr));
- + addrs = (ElfW(Addr) *) (array + loadaddr);
- + for (j = 0; j < jm; ++j) {
- + void (*dl_elf_func) (void);
- + dl_elf_func = (void (*)(void)) (intptr_t) addrs[j];
- + (*dl_elf_func) ();
- + }
- + }
- +}
- +
- +void _dl_run_init_array(struct elf_resolve *tpnt);
- +void _dl_run_init_array(struct elf_resolve *tpnt)
- +{
- + _dl_run_array_forward(tpnt->dynamic_info[DT_INIT_ARRAY],
- + tpnt->dynamic_info[DT_INIT_ARRAYSZ],
- + tpnt->loadaddr);
- +}
- +
- +void _dl_app_init_array(void);
- +void _dl_app_init_array(void)
- +{
- + _dl_run_init_array(_dl_loaded_modules);
- +}
- +
- +void _dl_run_fini_array(struct elf_resolve *tpnt);
- +void _dl_run_fini_array(struct elf_resolve *tpnt)
- +{
- + if (tpnt->dynamic_info[DT_FINI_ARRAY]) {
- + ElfW(Addr) *array = (ElfW(Addr) *) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI_ARRAY]);
- + unsigned int i = (tpnt->dynamic_info[DT_FINI_ARRAYSZ] / sizeof(ElfW(Addr)));
- + while (i-- > 0) {
- + void (*dl_elf_func) (void);
- + dl_elf_func = (void (*)(void)) (intptr_t) array[i];
- + (*dl_elf_func) ();
- + }
- + }
- +}
- +
- +void _dl_app_fini_array(void);
- +void _dl_app_fini_array(void)
- +{
- + _dl_run_fini_array(_dl_loaded_modules);
- +}
- +
- static void __attribute__ ((destructor)) __attribute_used__ _dl_fini(void)
- {
- int i;
- @@ -95,6 +165,7 @@
- if (tpnt->init_flag & FINI_FUNCS_CALLED)
- continue;
- tpnt->init_flag |= FINI_FUNCS_CALLED;
- + _dl_run_fini_array(tpnt);
- if (tpnt->dynamic_info[DT_FINI]) {
- void (*dl_elf_func) (void);
-
- @@ -112,7 +183,8 @@
- ElfW(Phdr) *ppnt;
- ElfW(Dyn) *dpnt;
- char *lpntstr;
- - int i, goof = 0, unlazy = 0, trace_loaded_objects = 0;
- + unsigned int i;
- + int unlazy = 0, trace_loaded_objects = 0;
- struct dyn_elf *rpnt;
- struct elf_resolve *tcurr;
- struct elf_resolve *tpnt1;
- @@ -128,6 +200,7 @@
- * setup so we can use _dl_dprintf() to print debug noise
- * instead of the SEND_STDERR macros used in dl-startup.c */
-
- + _dl_memset(app_tpnt, 0x00, sizeof(*app_tpnt));
-
- /* Store the page size for later use */
- _dl_pagesize = (auxvt[AT_PAGESZ].a_un.a_val) ? (size_t) auxvt[AT_PAGESZ].a_un.a_val : PAGE_SIZE;
- @@ -168,8 +241,8 @@
- * Note that for SUID programs we ignore the settings in
- * LD_LIBRARY_PATH.
- */
- - if ((auxvt[AT_UID].a_un.a_val == -1 && _dl_suid_ok()) ||
- - (auxvt[AT_UID].a_un.a_val != -1 &&
- + if ((auxvt[AT_UID].a_un.a_val == (size_t)-1 && _dl_suid_ok()) ||
- + (auxvt[AT_UID].a_un.a_val != (size_t)-1 &&
- auxvt[AT_UID].a_un.a_val == auxvt[AT_EUID].a_un.a_val &&
- auxvt[AT_GID].a_un.a_val == auxvt[AT_EGID].a_un.a_val)) {
- _dl_secure = 0;
- @@ -196,6 +269,20 @@
- unlazy = RTLD_NOW;
- }
-
- + /* sjhill: your TLS init should go before this */
- +#ifdef __UCLIBC_HAS_SSP__
- + /* Set up the stack checker's canary. */
- + stack_chk_guard = _dl_setup_stack_chk_guard ();
- +# ifdef THREAD_SET_STACK_GUARD
- + THREAD_SET_STACK_GUARD (stack_chk_guard);
- +# ifdef __UCLIBC_HAS_SSP_COMPAT__
- + __guard = stack_chk_guard;
- +# endif
- +# else
- + __stack_chk_guard = stack_chk_guard;
- +# endif
- +#endif
- +
- /* At this point we are now free to examine the user application,
- * and figure out which libraries are supposed to be called. Until
- * we have this list, we will not be completely ready for dynamic
- @@ -206,12 +293,12 @@
- * different from what the ELF header says for ET_DYN/PIE executables.
- */
- {
- - int i;
- - ElfW(Phdr) *ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_val;
- + unsigned int idx;
- + ElfW(Phdr) *phdr = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_val;
-
- - for (i = 0; i < auxvt[AT_PHNUM].a_un.a_val; i++, ppnt++)
- - if (ppnt->p_type == PT_PHDR) {
- - app_tpnt->loadaddr = (ElfW(Addr)) (auxvt[AT_PHDR].a_un.a_val - ppnt->p_vaddr);
- + for (idx = 0; idx < auxvt[AT_PHNUM].a_un.a_val; idx++, phdr++)
- + if (phdr->p_type == PT_PHDR) {
- + app_tpnt->loadaddr = (ElfW(Addr)) (auxvt[AT_PHDR].a_un.a_val - phdr->p_vaddr);
- break;
- }
-
- @@ -459,8 +546,8 @@
- PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
- _dl_close(fd);
- if (preload == (caddr_t) -1) {
- - _dl_dprintf(_dl_debug_file, "%s: can't map file '%s'\n",
- - _dl_progname, LDSO_PRELOAD);
- + _dl_dprintf(_dl_debug_file, "%s:%i: can't map '%s'\n",
- + _dl_progname, __LINE__, LDSO_PRELOAD);
- break;
- }
-
- @@ -528,15 +615,15 @@
-
- nlist = 0;
- for (tcurr = _dl_loaded_modules; tcurr; tcurr = tcurr->next) {
- - ElfW(Dyn) *dpnt;
- + ElfW(Dyn) *this_dpnt;
-
- nlist++;
- - for (dpnt = (ElfW(Dyn) *) tcurr->dynamic_addr; dpnt->d_tag; dpnt++) {
- - if (dpnt->d_tag == DT_NEEDED) {
- + for (this_dpnt = (ElfW(Dyn) *) tcurr->dynamic_addr; this_dpnt->d_tag; this_dpnt++) {
- + if (this_dpnt->d_tag == DT_NEEDED) {
- char *name;
- struct init_fini_list *tmp;
-
- - lpntstr = (char*) (tcurr->dynamic_info[DT_STRTAB] + dpnt->d_un.d_val);
- + lpntstr = (char*) (tcurr->dynamic_info[DT_STRTAB] + this_dpnt->d_un.d_val);
- name = _dl_get_last_path_component(lpntstr);
- if (_dl_strcmp(name, UCLIBC_LDSO) == 0)
- continue;
- @@ -633,7 +720,7 @@
- ElfW(Ehdr) *epnt = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_val;
- ElfW(Phdr) *myppnt = (ElfW(Phdr) *) (load_addr + epnt->e_phoff);
- int j;
- -
- +
- tpnt = _dl_add_elf_hash_table(tpnt->libname, (char *)load_addr,
- tpnt->dynamic_info,
- (unsigned long)tpnt->dynamic_addr,
- @@ -703,16 +790,14 @@
- * order so that COPY directives work correctly.
- */
- if (_dl_symbol_tables)
- - goof += _dl_fixup(_dl_symbol_tables, unlazy);
- + if (_dl_fixup(_dl_symbol_tables, unlazy))
- + _dl_exit(-1);
-
- for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
- if (tpnt->relro_size)
- _dl_protect_relro (tpnt);
- }
-
- -
- -
- -
- /* OK, at this point things are pretty much ready to run. Now we need
- * to touch up a few items that are required, and then we can let the
- * user application have at it. Note that the dynamic linker itself
- @@ -746,6 +831,14 @@
- /* Notify the debugger we have added some objects. */
- _dl_debug_addr->r_state = RT_ADD;
- _dl_debug_state();
- +
- + /* Run pre-initialization functions for the executable. */
- + _dl_run_array_forward(_dl_loaded_modules->dynamic_info[DT_PREINIT_ARRAY],
- + _dl_loaded_modules->dynamic_info[DT_PREINIT_ARRAYSZ],
- + _dl_loaded_modules->loadaddr);
- +
- + /* Run initialization functions for loaded objects. For the
- + main executable, they will be run from __uClibc_main. */
- for (i = nlist; i; --i) {
- tpnt = init_fini_list[i-1];
- tpnt->init_fini = NULL; /* Clear, since alloca was used */
- @@ -762,17 +855,9 @@
-
- (*dl_elf_func) ();
- }
- - }
- -#ifdef _DL_FINI_CRT_COMPAT
- - /* arches that have moved their ldso FINI handling should skip this part */
- - {
- - int (*_dl_atexit) (void *) = (int (*)(void *)) (intptr_t) _dl_find_hash("atexit",
- - _dl_symbol_tables, NULL, ELF_RTYPE_CLASS_PLT);
-
- - if (_dl_atexit)
- - (*_dl_atexit) (_dl_fini);
- + _dl_run_init_array(tpnt);
- }
- -#endif
-
- /* Find the real malloc function and make ldso functions use that from now on */
- _dl_malloc_function = (void* (*)(size_t)) (intptr_t) _dl_find_hash("malloc",
- diff -urN uClibc-0.9.28.orig/ldso/ldso/m68k/dl-startup.h uClibc-0.9.28/ldso/ldso/m68k/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/m68k/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/m68k/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -4,23 +4,48 @@
- * Copyright (C) 2005 by Erik Andersen <andersen@codepoet.org>
- */
-
- -asm(
- - " .text\n"
- - " .globl _start\n"
- - " .type _start,@function\n"
- - "_start:\n"
- - " .set _start,_dl_start\n"
- - " .size _start,.-_start\n"
- - " .previous\n"
- -);
- +asm ("\
- + .text\n\
- + .globl _start\n\
- + .type _start,@function\n\
- +_start:\n\
- + move.l %sp, -(%sp)\n\
- + jbsr _dl_start\n\
- + addq.l #4, %sp\n\
- + /* FALLTHRU */\n\
- +\n\
- + .globl _dl_start_user\n\
- +.type _dl_start_user,@function\n\
- +_dl_start_user:\n\
- + # Save the user entry point address in %a4.\n\
- + move.l %d0, %a4\n\
- + # See if we were run as a command with the executable file\n\
- + # name as an extra leading argument.\n\
- + move.l _dl_skip_args(%pc), %d0\n\
- + # Pop the original argument count\n\
- + move.l (%sp)+, %d1\n\
- + # Subtract _dl_skip_args from it.\n\
- + sub.l %d0, %d1\n\
- + # Adjust the stack pointer to skip _dl_skip_args words.\n\
- + lea (%sp, %d0*4), %sp\n\
- + # Push back the modified argument count.\n\
- + move.l %d1, -(%sp)\n\
- + # Pass our finalizer function to the user in %a1.\n\
- + lea _dl_fini(%pc), %a1\n\
- + # Initialize %fp with the stack pointer.\n\
- + move.l %sp, %fp\n\
- + # Jump to the user's entry point.\n\
- + jmp (%a4)\n\
- + .size _dl_start_user, . - _dl_start_user\n\
- + .previous");
-
- /* Get a pointer to the argv array. On many platforms this can be just
- * the address if the first argument, on other platforms we need to
- * do something a little more subtle here. */
- -#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned int *) & ARGS)
- +#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS) + 1)
-
- /* Handle relocation of the symbols in the dynamic loader. */
- -static inline
- +static __always_inline
- void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
- unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
- {
- @@ -59,12 +84,3 @@
- _dl_exit (1);
- }
- }
- -
- -/* Transfer control to the user's application, once the dynamic loader is
- - * done. This routine has to exit the current function, then call the
- - * _dl_elf_main function. */
- -#define START() \
- - __asm__ volatile ( \
- - "unlk %%a6\n\t" \
- - "jmp %0@" \
- - : : "a" (_dl_elf_main));
- diff -urN uClibc-0.9.28.orig/ldso/ldso/m68k/dl-syscalls.h uClibc-0.9.28/ldso/ldso/m68k/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/m68k/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/m68k/dl-syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,5 +1,6 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
- diff -urN uClibc-0.9.28.orig/ldso/ldso/m68k/dl-sysdep.h uClibc-0.9.28/ldso/ldso/m68k/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/m68k/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/m68k/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -25,10 +25,6 @@
- struct elf_resolve;
- extern unsigned int _dl_linux_resolver (struct elf_resolve *, int);
-
- -/* Define this because we do not want to call .udiv in the library.
- - Not needed for m68k. */
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 4096 bytes alignment */
- #define PAGE_ALIGN 0xfffff000
- #define ADDR_ALIGN 0xfff
- diff -urN uClibc-0.9.28.orig/ldso/ldso/m68k/elfinterp.c uClibc-0.9.28/ldso/ldso/m68k/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/m68k/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/m68k/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -40,6 +40,8 @@
- a more than adequate job of explaining everything required to get this
- working. */
-
- +#include "ldso.h"
- +
- extern int _dl_linux_resolve(void);
-
- unsigned int
- @@ -48,20 +50,20 @@
- int reloc_type;
- ELF_RELOC *this_reloc;
- char *strtab;
- - Elf32_Sym *symtab;
- + ElfW(Sym) *symtab;
- int symtab_index;
- - ELF_RELOC *rel_addr;
- + char *rel_addr;
- char *new_addr;
- char **got_addr;
- - unsigned int instr_addr;
- + ElfW(Addr) instr_addr;
- char *symname;
-
- - rel_addr = (ELF_RELOC *)tpnt->dynamic_info[DT_JMPREL];
- - this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
- - reloc_type = ELF32_R_TYPE(this_reloc->r_info);
- - symtab_index = ELF32_R_SYM(this_reloc->r_info);
- + rel_addr = (char *)tpnt->dynamic_info[DT_JMPREL];
- + this_reloc = (ELF_RELOC *)(rel_addr + reloc_entry);
- + reloc_type = ELF_R_TYPE(this_reloc->r_info);
- + symtab_index = ELF_R_SYM(this_reloc->r_info);
-
- - symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
- + symtab = (ElfW(Sym) *)tpnt->dynamic_info[DT_SYMTAB];
- strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
- symname = strtab + symtab[symtab_index].st_name;
-
- @@ -72,7 +74,7 @@
- }
-
- /* Address of the jump instruction to fix up. */
- - instr_addr = ((int)this_reloc->r_offset + (int)tpnt->loadaddr);
- + instr_addr = (this_reloc->r_offset + tpnt->loadaddr);
- got_addr = (char **)instr_addr;
-
- /* Get the address of the GOT entry. */
- @@ -88,159 +90,237 @@
- _dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname);
- if (_dl_debug_detail)
- _dl_dprintf(_dl_debug_file,
- - "\n\tpatched: %x ==> %x @ %x",
- + "\tpatched: %x ==> %x @ %x\n",
- *got_addr, new_addr, got_addr);
- }
- }
- - if (!_dl_debug_nofixups) {
- - *got_addr = new_addr;
- - }
- -#else
- - *got_addr = new_addr;
- + if (!_dl_debug_nofixups)
- #endif
- + *got_addr = new_addr;
-
- - return (unsigned int)new_addr;
- + return (unsigned int)new_addr;
- }
-
- -void
- -_dl_parse_lazy_relocation_information(struct dyn_elf *arg_rpnt,
- - unsigned long rel_addr, unsigned long rel_size)
- +static int
- +_dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + unsigned long rel_addr, unsigned long rel_size,
- + int (*reloc_fnc)(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab))
- {
- - int i;
- + unsigned int i;
- char *strtab;
- - int reloc_type;
- + ElfW(Sym) *symtab;
- + ELF_RELOC *rpnt;
- int symtab_index;
- - Elf32_Sym *symtab;
- - Elf32_Rela *rpnt;
- - unsigned int *reloc_addr;
- - struct elf_resolve *tpnt = arg_rpnt->dyn;
- -
- - /* Now parse the relocation information. */
- - rpnt = (Elf32_Rela *)rel_addr;
- - rel_size = rel_size / sizeof (Elf32_Rela);
-
- - symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
- + /* Parse the relocation information. */
- + rpnt = (ELF_RELOC *)rel_addr;
- + rel_size /= sizeof(ELF_RELOC);
- +
- + symtab = (ElfW(Sym) *)tpnt->dynamic_info[DT_SYMTAB];
- strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
-
- for (i = 0; i < rel_size; i++, rpnt++) {
- - reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);
- - reloc_type = ELF32_R_TYPE (rpnt->r_info);
- - symtab_index = ELF32_R_SYM (rpnt->r_info);
- + int res;
-
- - switch (reloc_type)
- - {
- - case R_68K_NONE:
- - break;
- - case R_68K_JMP_SLOT:
- - *reloc_addr += (unsigned int) tpnt->loadaddr;
- - break;
- - default:
- - _dl_dprintf (2, "%s: (LAZY) can't handle reloc type ", _dl_progname);
- + symtab_index = ELF_R_SYM(rpnt->r_info);
- +
- + debug_sym(symtab, strtab, symtab_index);
- + debug_reloc(symtab, strtab, rpnt);
- +
- + res = reloc_fnc(tpnt, scope, rpnt, symtab, strtab);
- +
- + if (res == 0)
- + continue;
- +
- + _dl_dprintf(2, "\n%s: ", _dl_progname);
- +
- + if (symtab_index)
- + _dl_dprintf(2, "symbol '%s': ",
- + strtab + symtab[symtab_index].st_name);
- +
- + if (unlikely(res < 0)) {
- + int reloc_type = ELF_R_TYPE(rpnt->r_info);
- +
- + _dl_dprintf(2, "can't handle reloc type "
- #if defined (__SUPPORT_LD_DEBUG__)
- - _dl_dprintf (2, "%s ", _dl_reltypes_tab[reloc_type]);
- + "%s\n", _dl_reltypes(reloc_type));
- +#else
- + "%x\n", reloc_type);
- #endif
- - if (symtab_index)
- - _dl_dprintf (2, "'%s'", strtab + symtab[symtab_index].st_name);
- - _dl_dprintf (2, "\n");
- - _dl_exit (1);
- + _dl_exit(-res);
- + } else if (unlikely(res > 0)) {
- + _dl_dprintf(2, "can't resolve symbol\n");
- + return res;
- }
- }
- +
- + return 0;
- }
-
- -int
- -_dl_parse_relocation_information(struct dyn_elf *arg_rpnt,
- - unsigned long rel_addr, unsigned long rel_size)
- +static int
- +_dl_do_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab)
- {
- - int i;
- - char *strtab;
- int reloc_type;
- - int goof = 0;
- - Elf32_Sym *symtab;
- - Elf32_Rela *rpnt;
- - unsigned int *reloc_addr;
- - unsigned int symbol_addr;
- int symtab_index;
- - struct elf_resolve *tpnt = arg_rpnt->dyn;
- - /* Now parse the relocation information */
- + char *symname;
- + ElfW(Sym) *sym;
- + ElfW(Addr) *reloc_addr;
- + ElfW(Addr) symbol_addr;
- +#if defined (__SUPPORT_LD_DEBUG__)
- + ElfW(Addr) old_val;
- +#endif
-
- - rpnt = (Elf32_Rela *)rel_addr;
- - rel_size = rel_size / sizeof (Elf32_Rela);
- + reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + (unsigned long)rpnt->r_offset);
- + reloc_type = ELF_R_TYPE(rpnt->r_info);
- + symtab_index = ELF_R_SYM(rpnt->r_info);
- + sym = &symtab[symtab_index];
- + symbol_addr = 0;
- + symname = strtab + sym->st_name;
- +
- + if (symtab_index) {
- + symbol_addr = (ElfW(Addr))_dl_find_hash(symname, scope, tpnt,
- + elf_machine_type_class(reloc_type));
- + /*
- + * We want to allow undefined references to weak symbols - this
- + * might have been intentional. We should not be linking local
- + * symbols here, so all bases should be covered.
- + */
- + if (unlikely(!symbol_addr && ELF_ST_BIND(sym->st_info) != STB_WEAK)) {
- + _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
- + _dl_exit(1);
- + };
- + }
-
- - symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
- - strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
- +#if defined (__SUPPORT_LD_DEBUG__)
- + old_val = *reloc_addr;
- +#endif
-
- - for (i = 0; i < rel_size; i++, rpnt++) {
- - reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);
- - reloc_type = ELF32_R_TYPE (rpnt->r_info);
- - symtab_index = ELF32_R_SYM (rpnt->r_info);
- - symbol_addr = 0;
- - if (symtab_index) {
- - symbol_addr = (unsigned int)
- - _dl_find_hash (strtab + symtab[symtab_index].st_name,
- - tpnt->symbol_scope, tpnt,
- - elf_machine_type_class(reloc_type));
- -
- - /* We want to allow undefined references to weak symbols -
- - this might have been intentional. We should not be
- - linking local symbols here, so all bases should be
- - covered. */
- - if (!symbol_addr
- - && ELF32_ST_BIND (symtab[symtab_index].st_info) != STB_WEAK)
- - {
- - _dl_dprintf (2, "%s: can't resolve symbol '%s'\n",
- - _dl_progname, strtab + symtab[symtab_index].st_name);
- - _dl_exit (1);
- - }
- - }
- - switch (reloc_type)
- - {
- - case R_68K_NONE:
- - break;
- - case R_68K_8:
- - *(char *) reloc_addr = symbol_addr + rpnt->r_addend;
- - break;
- - case R_68K_16:
- - *(short *) reloc_addr = symbol_addr + rpnt->r_addend;
- - break;
- - case R_68K_32:
- - *reloc_addr = symbol_addr + rpnt->r_addend;
- - break;
- - case R_68K_PC8:
- - *(char *) reloc_addr = (symbol_addr + rpnt->r_addend
- - - (unsigned int) reloc_addr);
- - break;
- - case R_68K_PC16:
- - *(short *) reloc_addr = (symbol_addr + rpnt->r_addend
- - - (unsigned int) reloc_addr);
- - break;
- - case R_68K_PC32:
- - *reloc_addr = (symbol_addr + rpnt->r_addend
- - - (unsigned int) reloc_addr);
- - break;
- - case R_68K_GLOB_DAT:
- - case R_68K_JMP_SLOT:
- - *reloc_addr = symbol_addr;
- - break;
- - case R_68K_RELATIVE:
- - *reloc_addr = ((unsigned int) tpnt->loadaddr
- - /* Compatibility kludge. */
- - + (rpnt->r_addend ? : *reloc_addr));
- - break;
- - case R_68K_COPY:
- + switch (reloc_type) {
- + case R_68K_NONE:
- + break;
- + case R_68K_8:
- + *(char *) reloc_addr = symbol_addr + rpnt->r_addend;
- + break;
- + case R_68K_16:
- + *(short *) reloc_addr = symbol_addr + rpnt->r_addend;
- + break;
- + case R_68K_32:
- + *reloc_addr = symbol_addr + rpnt->r_addend;
- + break;
- + case R_68K_PC8:
- + *(char *) reloc_addr = (symbol_addr + rpnt->r_addend
- + - (unsigned int) reloc_addr);
- + break;
- + case R_68K_PC16:
- + *(short *) reloc_addr = (symbol_addr + rpnt->r_addend
- + - (unsigned int) reloc_addr);
- + break;
- + case R_68K_PC32:
- + *reloc_addr = (symbol_addr + rpnt->r_addend
- + - (unsigned int) reloc_addr);
- + break;
- + case R_68K_GLOB_DAT:
- + case R_68K_JMP_SLOT:
- + *reloc_addr = symbol_addr + rpnt->r_addend;
- + break;
- + /* handled by elf_machine_relative()
- + case R_68K_RELATIVE:
- + *reloc_addr = ((unsigned int) tpnt->loadaddr
- + / * Compatibility kludge. * /
- + + (rpnt->r_addend ? : *reloc_addr));
- + */
- + break;
- + case R_68K_COPY:
- + if (symbol_addr) {
- +#if defined (__SUPPORT_LD_DEBUG__)
- + if (_dl_debug_move)
- + _dl_dprintf(_dl_debug_file,
- + "\t%s move %d bytes from %x to %x\n",
- + symname, sym->st_size,
- + symbol_addr, reloc_addr);
- +#endif
- _dl_memcpy ((void *) reloc_addr,
- (void *) symbol_addr,
- - symtab[symtab_index].st_size);
- - break;
- - default:
- - _dl_dprintf (2, "%s: can't handle reloc type ", _dl_progname);
- -#if defined (__SUPPORT_LD_DEBUG__)
- - _dl_dprintf (2, "%s ", _dl_reltypes_tab[reloc_type]);
- -#endif
- - if (symtab_index)
- - _dl_dprintf (2, "'%s'", strtab + symtab[symtab_index].st_name);
- - _dl_dprintf (2, "\n");
- - _dl_exit (1);
- - }
- + sym->st_size);
- + } else
- + _dl_dprintf(_dl_debug_file, "no symbol_addr to copy !?\n");
- + break;
- +
- + default:
- + return -1; /* Calls _dl_exit(1). */
- + }
- +
- +#if defined (__SUPPORT_LD_DEBUG__)
- + if (_dl_debug_reloc && _dl_debug_detail)
- + _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x\n",
- + old_val, *reloc_addr, reloc_addr);
- +#endif
- +
- + return 0;
- +}
- +
- +#undef LAZY_RELOC_WORKS
- +#ifdef LAZY_RELOC_WORKS
- +static int
- +_dl_do_lazy_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab)
- +{
- + int reloc_type;
- + int symtab_index;
- + ElfW(Addr) *reloc_addr;
- +#if defined (__SUPPORT_LD_DEBUG__)
- + ElfW(Addr) old_val;
- +#endif
- +
- + (void)scope;
- + symtab_index = ELF_R_SYM(rpnt->r_info);
- + (void)strtab;
- +
- + reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + rpnt->r_offset);
- + reloc_type = ELF_R_TYPE(rpnt->r_info);
- +
- +#if defined (__SUPPORT_LD_DEBUG__)
- + old_val = *reloc_addr;
- +#endif
- +
- + switch (reloc_type) {
- + case R_68K_NONE:
- + break;
- + case R_68K_JMP_SLOT:
- + *reloc_addr += (unsigned int) tpnt->loadaddr;
- + break;
- + default:
- + _dl_exit(1);
- }
- - return goof;
- +
- +#if defined (__SUPPORT_LD_DEBUG__)
- + if (_dl_debug_reloc && _dl_debug_detail)
- + _dl_dprintf(_dl_debug_file, "\tpatched_lazy: %x ==> %x @ %x\n",
- + old_val, *reloc_addr, reloc_addr);
- +#endif
- +
- + return 0;
- +}
- +#endif
- +
- +void
- +_dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
- + unsigned long rel_addr,
- + unsigned long rel_size)
- +{
- +#ifdef LAZY_RELOC_WORKS
- + (void)_dl_parse(rpnt->dyn, NULL, rel_addr, rel_size, _dl_do_lazy_reloc);
- +#else
- + _dl_parse_relocation_information(rpnt, rel_addr, rel_size);
- +#endif
- +}
- +
- +int
- +_dl_parse_relocation_information(struct dyn_elf *rpnt,
- + unsigned long rel_addr,
- + unsigned long rel_size)
- +{
- + return _dl_parse(rpnt->dyn, rpnt->dyn->symbol_scope, rel_addr, rel_size, _dl_do_reloc);
- }
- diff -urN uClibc-0.9.28.orig/ldso/ldso/m68k/resolve.S uClibc-0.9.28/ldso/ldso/m68k/resolve.S
- --- uClibc-0.9.28.orig/ldso/ldso/m68k/resolve.S 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/m68k/resolve.S 2006-04-28 00:14:35.000000000 -0600
- @@ -8,14 +8,16 @@
- .globl _dl_linux_resolve
- .type _dl_linux_resolve,@function
- _dl_linux_resolve:
- - moveml %a0/%a1,%sp@-
- -#ifdef __PIC__
- - bsrl _dl_linux_resolver@PLTPC
- -#else
- - jbsr _dl_linux_resolver
- -#endif
- - moveml %sp@+,%a0/%a1
- - addql #8,%sp
- - jmp @(%d0)
- -.LFE2:
- - .size _dl_linux_resolve,.LFE2-_dl_linux_resolve
- + # Save %a0 (struct return address) and %a1.
- + move.l %a0, -(%sp)
- + move.l %a1, -(%sp)
- + # Call the real address resolver.
- + jbsr _dl_linux_resolver
- + # Restore register %a0 and %a1.
- + move.l (%sp)+, %a1
- + move.l (%sp)+, %a0
- + # Pop parameters
- + addq.l #8, %sp
- + # Call real function.
- + jmp (%d0)
- +.size _dl_linux_resolve,.-_dl_linux_resolve
- diff -urN uClibc-0.9.28.orig/ldso/ldso/mips/dl-startup.h uClibc-0.9.28/ldso/ldso/mips/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/mips/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/mips/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -136,13 +136,3 @@
- SEND_STDERR("Aiieeee!"); \
- _dl_exit(1); \
- }
- -
- -
- -/*
- - * Transfer control to the user's application, once the dynamic loader
- - * is done. This routine has to exit the current function, then
- - * call the _dl_elf_main function. For MIPS, we do it in assembly
- - * because the stack doesn't get properly restored otherwise. Got look
- - * at boot1_arch.h
- - */
- -#define START() return _dl_elf_main
- diff -urN uClibc-0.9.28.orig/ldso/ldso/mips/dl-syscalls.h uClibc-0.9.28/ldso/ldso/mips/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/mips/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/mips/dl-syscalls.h 2006-05-02 13:39:25.000000000 -0600
- @@ -1,7 +1,8 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#define __UCLIBC_MMAP_HAS_6_ARGS__
- +
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
- -
- -#define MMAP_HAS_6_ARGS
- diff -urN uClibc-0.9.28.orig/ldso/ldso/mips/dl-sysdep.h uClibc-0.9.28/ldso/ldso/mips/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/mips/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/mips/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -30,7 +30,7 @@
- /* Initialization sequence for the application/library GOT. */
- #define INIT_GOT(GOT_BASE,MODULE) \
- do { \
- - unsigned long i; \
- + unsigned long idx; \
- \
- /* Check if this is the dynamic linker itself */ \
- if (MODULE->libtype == program_interpreter) \
- @@ -41,9 +41,9 @@
- GOT_BASE[1] = (unsigned long) MODULE; \
- \
- /* Add load address displacement to all local GOT entries */ \
- - i = 2; \
- - while (i < MODULE->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX]) \
- - GOT_BASE[i++] += (unsigned long) MODULE->loadaddr; \
- + idx = 2; \
- + while (idx < MODULE->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX]) \
- + GOT_BASE[idx++] += (unsigned long) MODULE->loadaddr; \
- \
- } while (0)
-
- @@ -63,8 +63,6 @@
- struct elf_resolve;
- void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy);
-
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 4096 bytes alignment */
- #define PAGE_ALIGN 0xfffff000
- #define ADDR_ALIGN 0xfff
- diff -urN uClibc-0.9.28.orig/ldso/ldso/mips/elfinterp.c uClibc-0.9.28/ldso/ldso/mips/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/mips/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/mips/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -27,6 +27,8 @@
- * SUCH DAMAGE.
- */
-
- +#include "ldso.h"
- +
- extern int _dl_runtime_resolve(void);
-
- #define OFFSET_GP_GOT 0x7ff0
- @@ -146,7 +148,6 @@
- break;
- default:
- {
- - int reloc_type = ELF32_R_TYPE(rpnt->r_info);
- _dl_dprintf(2, "\n%s: ",_dl_progname);
-
- if (symtab_index)
- diff -urN uClibc-0.9.28.orig/ldso/ldso/powerpc/dl-startup.h uClibc-0.9.28/ldso/ldso/powerpc/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/powerpc/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/powerpc/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -42,8 +42,10 @@
- " bne 2b\n"
- " addi 6,6,4\n"
- #endif
- - /* Pass a termination function pointer (in this case _dl_fini) in r7. */
- - " lwz 7,_dl_fini@got(31)\n"
- + /* Pass a termination function pointer (in this case _dl_fini) in r3. */
- + /* Paulus promized he would keep r3 zero in the exec ABI. */
- + " lwz 3,_dl_fini@got(31)\n"
- + " mr 7,3\n" /* Pass _dl_fini in r7 to maintain compat */
- " bctr\n" /* Jump to entry point */
- " .size _start,.-_start\n"
- " .previous\n"
- @@ -78,9 +80,3 @@
- _dl_exit(100+ELF32_R_TYPE((RELP)->r_info));\
- } \
- }
- -/*
- - * Transfer control to the user's application, once the dynamic loader
- - * is done. This routine has to exit the current function, then
- - * call the _dl_elf_main function.
- - */
- -#define START() return _dl_elf_main
- diff -urN uClibc-0.9.28.orig/ldso/ldso/powerpc/dl-syscalls.h uClibc-0.9.28/ldso/ldso/powerpc/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/powerpc/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/powerpc/dl-syscalls.h 2006-05-02 13:39:14.000000000 -0600
- @@ -1,251 +1,8 @@
- -/*
- - * This file contains the system call macros and syscall
- - * numbers used by the shared library loader.
- - */
- -
- -#define MMAP_HAS_6_ARGS
- -
- -#define __NR_exit 1
- -#define __NR_read 3
- -#define __NR_write 4
- -#define __NR_open 5
- -#define __NR_close 6
- -#define __NR_getpid 20
- -#define __NR_getuid 24
- -#define __NR_geteuid 49
- -#define __NR_getgid 47
- -#define __NR_getegid 50
- -#define __NR_readlink 85
- -#define __NR_mmap 90
- -#define __NR_munmap 91
- -#define __NR_stat 106
- -#define __NR_mprotect 125
- -
- -
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- -extern int _dl_errno;
- -
- -/* Here are the macros which define how this platform makes
- - * system calls. This particular variant does _not_ set
- - * errno (note how it is disabled in __syscall_return) since
- - * these will get called before the errno symbol is dynamicly
- - * linked. */
- -
- -#undef __syscall_return
- -#define __syscall_return(type) \
- - return (__sc_err & 0x10000000 ? _dl_errno = __sc_ret, __sc_ret = -1 : 0), \
- - (type) __sc_ret
- -
- -#undef __syscall_clobbers
- -#define __syscall_clobbers \
- - "r9", "r10", "r11", "r12"
- - //"r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
- -
- -#undef _syscall0
- -#define _syscall0(type,name) \
- -type name(void) \
- -{ \
- - unsigned long __sc_ret, __sc_err; \
- - { \
- - register unsigned long __sc_0 __asm__ ("r0"); \
- - register unsigned long __sc_3 __asm__ ("r3"); \
- - \
- - __sc_0 = __NR_##name; \
- - __asm__ __volatile__ \
- - ("sc \n\t" \
- - "mfcr %1 " \
- - : "=&r" (__sc_3), "=&r" (__sc_0) \
- - : "0" (__sc_3), "1" (__sc_0) \
- - : "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \
- - __sc_ret = __sc_3; \
- - __sc_err = __sc_0; \
- - } \
- - __syscall_return (type); \
- -}
- -
- -#undef _syscall1
- -#define _syscall1(type,name,type1,arg1) \
- -type name(type1 arg1) \
- -{ \
- - unsigned long __sc_ret, __sc_err; \
- - { \
- - register unsigned long __sc_0 __asm__ ("r0"); \
- - register unsigned long __sc_3 __asm__ ("r3"); \
- - \
- - __sc_3 = (unsigned long) (arg1); \
- - __sc_0 = __NR_##name; \
- - __asm__ __volatile__ \
- - ("sc \n\t" \
- - "mfcr %1 " \
- - : "=&r" (__sc_3), "=&r" (__sc_0) \
- - : "0" (__sc_3), "1" (__sc_0) \
- - : "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \
- - __sc_ret = __sc_3; \
- - __sc_err = __sc_0; \
- - } \
- - __syscall_return (type); \
- -}
- -
- -#undef _syscall2
- -#define _syscall2(type,name,type1,arg1,type2,arg2) \
- -type name(type1 arg1, type2 arg2) \
- -{ \
- - unsigned long __sc_ret, __sc_err; \
- - { \
- - register unsigned long __sc_0 __asm__ ("r0"); \
- - register unsigned long __sc_3 __asm__ ("r3"); \
- - register unsigned long __sc_4 __asm__ ("r4"); \
- - \
- - __sc_3 = (unsigned long) (arg1); \
- - __sc_4 = (unsigned long) (arg2); \
- - __sc_0 = __NR_##name; \
- - __asm__ __volatile__ \
- - ("sc \n\t" \
- - "mfcr %1 " \
- - : "=&r" (__sc_3), "=&r" (__sc_0) \
- - : "0" (__sc_3), "1" (__sc_0), \
- - "r" (__sc_4) \
- - : "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \
- - __sc_ret = __sc_3; \
- - __sc_err = __sc_0; \
- - } \
- - __syscall_return (type); \
- -}
- -
- -#undef _syscall3
- -#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
- -type name(type1 arg1, type2 arg2, type3 arg3) \
- -{ \
- - unsigned long __sc_ret, __sc_err; \
- - { \
- - register unsigned long __sc_0 __asm__ ("r0"); \
- - register unsigned long __sc_3 __asm__ ("r3"); \
- - register unsigned long __sc_4 __asm__ ("r4"); \
- - register unsigned long __sc_5 __asm__ ("r5"); \
- - \
- - __sc_3 = (unsigned long) (arg1); \
- - __sc_4 = (unsigned long) (arg2); \
- - __sc_5 = (unsigned long) (arg3); \
- - __sc_0 = __NR_##name; \
- - __asm__ __volatile__ \
- - ("sc \n\t" \
- - "mfcr %1 " \
- - : "=&r" (__sc_3), "=&r" (__sc_0) \
- - : "0" (__sc_3), "1" (__sc_0), \
- - "r" (__sc_4), \
- - "r" (__sc_5) \
- - : "r6", "r7", "r8", "r9", "r10", "r11", "r12" ); \
- - __sc_ret = __sc_3; \
- - __sc_err = __sc_0; \
- - } \
- - __syscall_return (type); \
- -}
- -
- -#undef _syscall4
- -#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
- -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
- -{ \
- - unsigned long __sc_ret, __sc_err; \
- - { \
- - register unsigned long __sc_0 __asm__ ("r0"); \
- - register unsigned long __sc_3 __asm__ ("r3"); \
- - register unsigned long __sc_4 __asm__ ("r4"); \
- - register unsigned long __sc_5 __asm__ ("r5"); \
- - register unsigned long __sc_6 __asm__ ("r6"); \
- - \
- - __sc_3 = (unsigned long) (arg1); \
- - __sc_4 = (unsigned long) (arg2); \
- - __sc_5 = (unsigned long) (arg3); \
- - __sc_6 = (unsigned long) (arg4); \
- - __sc_0 = __NR_##name; \
- - __asm__ __volatile__ \
- - ("sc \n\t" \
- - "mfcr %1 " \
- - : "=&r" (__sc_3), "=&r" (__sc_0) \
- - : "0" (__sc_3), "1" (__sc_0), \
- - "r" (__sc_4), \
- - "r" (__sc_5), \
- - "r" (__sc_6) \
- - : "r7", "r8", "r9", "r10", "r11", "r12" ); \
- - __sc_ret = __sc_3; \
- - __sc_err = __sc_0; \
- - } \
- - __syscall_return (type); \
- -}
- -
- -#undef _syscall5
- -#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
- -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
- -{ \
- - unsigned long __sc_ret, __sc_err; \
- - { \
- - register unsigned long __sc_0 __asm__ ("r0"); \
- - register unsigned long __sc_3 __asm__ ("r3"); \
- - register unsigned long __sc_4 __asm__ ("r4"); \
- - register unsigned long __sc_5 __asm__ ("r5"); \
- - register unsigned long __sc_6 __asm__ ("r6"); \
- - register unsigned long __sc_7 __asm__ ("r7"); \
- - \
- - __sc_3 = (unsigned long) (arg1); \
- - __sc_4 = (unsigned long) (arg2); \
- - __sc_5 = (unsigned long) (arg3); \
- - __sc_6 = (unsigned long) (arg4); \
- - __sc_7 = (unsigned long) (arg5); \
- - __sc_0 = __NR_##name; \
- - __asm__ __volatile__ \
- - ("sc \n\t" \
- - "mfcr %1 " \
- - : "=&r" (__sc_3), "=&r" (__sc_0) \
- - : "0" (__sc_3), "1" (__sc_0), \
- - "r" (__sc_4), \
- - "r" (__sc_5), \
- - "r" (__sc_6), \
- - "r" (__sc_7) \
- - : "r8", "r9", "r10", "r11", "r12" ); \
- - __sc_ret = __sc_3; \
- - __sc_err = __sc_0; \
- - } \
- - __syscall_return (type); \
- -}
- -
- -
- -#undef _syscall6
- -#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \
- -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) \
- -{ \
- - unsigned long __sc_ret, __sc_err; \
- - { \
- - register unsigned long __sc_0 __asm__ ("r0"); \
- - register unsigned long __sc_3 __asm__ ("r3"); \
- - register unsigned long __sc_4 __asm__ ("r4"); \
- - register unsigned long __sc_5 __asm__ ("r5"); \
- - register unsigned long __sc_6 __asm__ ("r6"); \
- - register unsigned long __sc_7 __asm__ ("r7"); \
- - register unsigned long __sc_8 __asm__ ("r8"); \
- - \
- - __sc_3 = (unsigned long) (arg1); \
- - __sc_4 = (unsigned long) (arg2); \
- - __sc_5 = (unsigned long) (arg3); \
- - __sc_6 = (unsigned long) (arg4); \
- - __sc_7 = (unsigned long) (arg5); \
- - __sc_8 = (unsigned long) (arg6); \
- - __sc_0 = __NR_##name; \
- - __asm__ __volatile__ \
- - ("sc \n\t" \
- - "mfcr %1 " \
- - : "=&r" (__sc_3), "=&r" (__sc_0) \
- - : "0" (__sc_3), "1" (__sc_0), \
- - "r" (__sc_4), \
- - "r" (__sc_5), \
- - "r" (__sc_6), \
- - "r" (__sc_7), \
- - "r" (__sc_8) \
- - : "r9", "r10", "r11", "r12" ); \
- - __sc_ret = __sc_3; \
- - __sc_err = __sc_0; \
- - } \
- - __syscall_return (type); \
- -}
- -
- +#define __UCLIBC_MMAP_HAS_6_ARGS__
-
- +#include "sys/syscall.h"
- +extern int _dl_errno;
- +#undef __set_errno
- +#define __set_errno(X) {(_dl_errno) = (X);}
- diff -urN uClibc-0.9.28.orig/ldso/ldso/powerpc/dl-sysdep.h uClibc-0.9.28/ldso/ldso/powerpc/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/powerpc/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/powerpc/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -67,9 +67,6 @@
- extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
- void _dl_init_got(unsigned long *lpnt,struct elf_resolve *tpnt);
-
- -
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 4096 bytes alignment */
- #define PAGE_ALIGN 0xfffff000
- #define ADDR_ALIGN 0xfff
- diff -urN uClibc-0.9.28.orig/ldso/ldso/powerpc/elfinterp.c uClibc-0.9.28/ldso/ldso/powerpc/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/powerpc/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/powerpc/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -29,6 +29,8 @@
- * SUCH DAMAGE.
- */
-
- +#include "ldso.h"
- +
- extern int _dl_linux_resolve(void);
-
- void _dl_init_got(unsigned long *plt,struct elf_resolve *tpnt)
- @@ -138,7 +140,7 @@
- finaladdr = (Elf32_Addr) _dl_find_hash(symname,
- tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT);
- if (unlikely(!finaladdr)) {
- - _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
- + _dl_dprintf(2, "%s: can't resolve symbol '%s' in lib '%s'.\n", _dl_progname, symname, tpnt->libname);
- _dl_exit(1);
- };
- finaladdr += this_reloc->r_addend;
- @@ -379,15 +381,15 @@
- {
- int reloc_type = ELF32_R_TYPE(rpnt->r_info);
- #if defined (__SUPPORT_LD_DEBUG__)
- - _dl_dprintf(2, "can't handle reloc type %s\n ", _dl_reltypes(reloc_type));
- + _dl_dprintf(2, "can't handle reloc type '%s' in lib '%s'\n", _dl_reltypes(reloc_type), tpnt->libname);
- #else
- - _dl_dprintf(2, "can't handle reloc type %x\n", reloc_type);
- + _dl_dprintf(2, "can't handle reloc type %x in lib '%s'\n", reloc_type, tpnt->libname);
- #endif
- - _dl_exit(-res);
- + return res;
- }
- if (unlikely(res >0))
- {
- - _dl_dprintf(2, "can't resolve symbol\n");
- + _dl_dprintf(2, "can't resolve symbol in lib '%s'.\n", tpnt->libname);
- return res;
- }
- }
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh/dl-startup.h uClibc-0.9.28/ldso/ldso/sh/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/sh/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -55,11 +55,3 @@
- default: \
- _dl_exit(1); \
- }
- -
- -
- -/*
- - * Transfer control to the user's application, once the dynamic loader
- - * is done. This routine has to exit the current function, then
- - * call the _dl_elf_main function.
- - */
- -#define START() return _dl_elf_main;
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh/dl-syscalls.h uClibc-0.9.28/ldso/ldso/sh/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/sh/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh/dl-syscalls.h 2006-05-02 13:39:28.000000000 -0600
- @@ -1,7 +1,8 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#define __UCLIBC_MMAP_HAS_6_ARGS__
- +
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
- -
- -#define MMAP_HAS_6_ARGS
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh/dl-sysdep.h uClibc-0.9.28/ldso/ldso/sh/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/sh/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -25,7 +25,7 @@
- struct elf_resolve;
- extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
-
- -static __inline__ unsigned int
- +static inline unsigned int
- _dl_urem(unsigned int n, unsigned int base)
- {
- int res;
- @@ -104,7 +104,7 @@
- elf_machine_dynamic (void)
- {
- register Elf32_Addr *got;
- - asm ("mov r12,%0" :"=r" (got));
- + __asm__ ("mov r12,%0" :"=r" (got));
- return *got;
- }
-
- @@ -113,7 +113,7 @@
- elf_machine_load_address (void)
- {
- Elf32_Addr addr;
- - asm ("mov.l 1f,r0\n\
- + __asm__ ("mov.l 1f,r0\n\
- mov.l 3f,r2\n\
- add r12,r2\n\
- mov.l @(r0,r12),r0\n\
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh/elfinterp.c uClibc-0.9.28/ldso/ldso/sh/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/sh/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -39,6 +39,8 @@
- a more than adequate job of explaining everything required to get this
- working. */
-
- +#include "ldso.h"
- +
- extern int _dl_linux_resolve(void);
-
- unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh64/dl-startup.h uClibc-0.9.28/ldso/ldso/sh64/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/sh64/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh64/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -115,12 +115,3 @@
- default: \
- _dl_exit(1); \
- }
- -
- -/*
- - * Transfer control to the user's application, once the dynamic loader
- - * is done. This routine has to exit the current function, then
- - * call the _dl_elf_main function.
- - */
- -
- -#define START() return _dl_elf_main;
- -
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh64/dl-syscalls.h uClibc-0.9.28/ldso/ldso/sh64/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/sh64/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh64/dl-syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,8 +1,9 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
-
- #undef __syscall_return
- #define __syscall_return(type, res) \
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh64/dl-sysdep.h uClibc-0.9.28/ldso/ldso/sh64/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/sh64/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh64/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -25,8 +25,6 @@
- struct elf_resolve;
- extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
-
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 4096 bytes alignment */
- #define PAGE_ALIGN 0xfffff000
- #define ADDR_ALIGN 0xfff
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sh64/elfinterp.c uClibc-0.9.28/ldso/ldso/sh64/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/sh64/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sh64/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -41,6 +41,8 @@
- a more than adequate job of explaining everything required to get this
- working. */
-
- +#include "ldso.h"
- +
- extern int _dl_linux_resolve(void);
-
- unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sparc/dl-startup.h uClibc-0.9.28/ldso/ldso/sparc/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/sparc/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sparc/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -3,15 +3,46 @@
- * needed for this architecture. See arm/boot1_arch.h for an example of what
- * can be done.
- */
- -asm(
- - " .text\n"
- - " .global _start\n"
- - " .type _start,%function\n"
- - "_start:\n"
- - " .set _start,_dl_start\n"
- - " .size _start,.-_start\n"
- - " .previous\n"
- -);
- +
- +asm ("\
- + .text\n\
- + .global _start\n\
- + .type _start,%function\n\
- + .align 32\n\
- +_start:\n\
- + /* Allocate space for functions to drop their arguments. */\n\
- + sub %sp, 6*4, %sp\n\
- + /* Pass pointer to argument block to _dl_start. */\n\
- + call _dl_start\n\
- + add %sp, 22*4, %o0\n\
- + /* FALTHRU */\n\
- + .globl _dl_start_user\n\
- + .type _dl_start_user, @function\n\
- +_dl_start_user:\n\
- + /* Load the PIC register. */\n\
- +1: call 2f\n\
- + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n\
- +2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n\
- + add %l7, %o7, %l7\n\
- + /* Save the user entry point address in %l0 */\n\
- + mov %o0, %l0\n\
- + /* See if we were run as a command with the executable file name as an\n\
- + extra leading argument. If so, adjust the contents of the stack. */\n\
- + sethi %hi(_dl_skip_args), %g2\n\
- + or %g2, %lo(_dl_skip_args), %g2\n\
- + ld [%l7+%g2], %i0\n\
- + ld [%i0], %i0\n\
- + tst %i0\n\
- + /* Pass our finalizer function to the user in %g1. */\n\
- + sethi %hi(_dl_fini), %g1\n\
- + or %g1, %lo(_dl_fini), %g1\n\
- + ld [%l7+%g1], %g1\n\
- + /* Jump to the user's entry point and deallocate the extra stack we got. */\n\
- + jmp %l0\n\
- + add %sp, 6*4, %sp\n\
- + .size _dl_start_user, . - _dl_start_user\n\
- + .previous\n\
- +");
-
- /*
- * Get a pointer to the argv array. On many platforms this can be just
- @@ -19,17 +50,15 @@
- * do something a little more subtle here. We assume that argc is stored
- * at the word just below the argvp that we return here.
- */
- -#define GET_ARGV(ARGVP, ARGS) __asm__("\tadd %%fp,68,%0\n" : "=r" (ARGVP));
- +#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS) + 1)
-
- /*
- * Here is a macro to perform a relocation. This is only used when
- * bootstrapping the dynamic loader.
- */
- #define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD,SYMTAB) \
- - switch(ELF32_R_TYPE((RELP)->r_info)) { \
- +switch(ELF_R_TYPE((RELP)->r_info)) { \
- case R_SPARC_32: \
- - *REL = SYMBOL + (RELP)->r_addend; \
- - break; \
- case R_SPARC_GLOB_DAT: \
- *REL = SYMBOL + (RELP)->r_addend; \
- break; \
- @@ -38,7 +67,6 @@
- REL[2] = 0x81c06000 | (SYMBOL & 0x3ff); \
- break; \
- case R_SPARC_NONE: \
- - break; \
- case R_SPARC_WDISP30: \
- break; \
- case R_SPARC_RELATIVE: \
- @@ -46,18 +74,4 @@
- break; \
- default: \
- _dl_exit(1); \
- - }
- -
- -/*
- - * Transfer control to the user's application, once the dynamic loader
- - * is done. The crt calls atexit with $g1 if not null, so we need to
- - * ensure that it contains NULL.
- - */
- -
- -#define START() \
- - __asm__ volatile ( \
- - "add %%g0,%%g0,%%g1\n\t" \
- - "jmpl %0, %%o7\n\t" \
- - "restore %%g0,%%g0,%%g0\n\t" \
- - : /*"=r" (status) */ : \
- - "r" (_dl_elf_main): "g1", "o0", "o1")
- +}
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sparc/dl-syscalls.h uClibc-0.9.28/ldso/ldso/sparc/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/sparc/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sparc/dl-syscalls.h 2006-05-02 13:39:21.000000000 -0600
- @@ -1,187 +1,8 @@
- -/*
- - * This file contains the system call macros and syscall
- - * numbers used by the shared library loader.
- - *
- - * NOTE: This should be integrated/moved to
- - * sysdeps/linux/sparc/bits/syscalls.h at some point ...
- - */
- -
- -#define MMAP_HAS_6_ARGS
- -
- -#define __NR_exit 1
- -#define __NR_read 3
- -#define __NR_write 4
- -#define __NR_open 5
- -#define __NR_close 6
- -#define __NR_getpid 20
- -#define __NR_getuid 24
- -#define __NR_getgid 47
- -#define __NR_geteuid 49
- -#define __NR_getegid 50
- -#define __NR_readlink 58
- -#define __NR_mmap 71
- -#define __NR_munmap 73
- -#define __NR_stat 38
- -#define __NR_mprotect 74
- -
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#define __UCLIBC_MMAP_HAS_6_ARGS__
- +
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -
- -/* Here are the macros which define how this platform makes
- - * system calls. This particular variant does _not_ set
- - * errno (note how _dl_errno is used in __syscall_return) since
- - * these will get called before the errno symbol is dynamicly
- - * linked. */
- -
- -#define __syscall_return(type, res) \
- -do { \
- - if (res < -255 || res >= 0) \
- - return (type) res; \
- - __set_errno(-res); \
- - res = -1; \
- - return (type) res; \
- -} while (0)
- -
- -#define _syscall0(type,name) \
- -type name(void) \
- -{ \
- - long __res; \
- - register long __g1 __asm__ ("g1") = __NR_##name; \
- - __asm__ __volatile__ ( \
- - "t 0x10\n\t" \
- - "bcc 1f\n\t" \
- - "mov %%o0, %0\n\t" \
- - "sub %%g0, %%o0, %0\n\t" \
- - "1:\n\t" \
- - : "=r" (__res)\
- - : "r" (__g1) \
- - : "o0", "cc"); \
- - __syscall_return(type, __res); \
- -}
- -
- -#define _syscall1(type,name,type1,arg1) \
- -type name(type1 arg1) \
- -{ \
- - long __res; \
- - register long __g1 __asm__ ("g1") = __NR_##name; \
- - register long __o0 __asm__ ("o0") = (long)(arg1); \
- - __asm__ __volatile__ ( \
- - "t 0x10\n\t" \
- - "bcc 1f\n\t" \
- - "mov %%o0, %0\n\t" \
- - "sub %%g0, %%o0, %0\n\t" \
- - "1:\n\t" \
- - : "=r" (__res), "=&r" (__o0) \
- - : "1" (__o0), "r" (__g1) \
- - : "cc"); \
- - __syscall_return(type, __res); \
- -}
- -
- -#define _syscall2(type,name,type1,arg1,type2,arg2) \
- -type name(type1 arg1,type2 arg2) \
- -{ \
- - long __res; \
- - register long __g1 __asm__ ("g1") = __NR_##name; \
- - register long __o0 __asm__ ("o0") = (long)(arg1); \
- - register long __o1 __asm__ ("o1") = (long)(arg2); \
- - __asm__ __volatile__ ( \
- - "t 0x10\n\t" \
- - "bcc 1f\n\t" \
- - "mov %%o0, %0\n\t" \
- - "sub %%g0, %%o0, %0\n\t" \
- - "1:\n\t" \
- - : "=r" (__res), "=&r" (__o0) \
- - : "1" (__o0), "r" (__o1), "r" (__g1) \
- - : "cc"); \
- - __syscall_return(type, __res); \
- -}
- -
- -#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
- -type name(type1 arg1,type2 arg2,type3 arg3) \
- -{ \
- - long __res; \
- - register long __g1 __asm__ ("g1") = __NR_##name; \
- - register long __o0 __asm__ ("o0") = (long)(arg1); \
- - register long __o1 __asm__ ("o1") = (long)(arg2); \
- - register long __o2 __asm__ ("o2") = (long)(arg3); \
- - __asm__ __volatile__ ( \
- - "t 0x10\n\t" \
- - "bcc 1f\n\t" \
- - "mov %%o0, %0\n\t" \
- - "sub %%g0, %%o0, %0\n\t" \
- - "1:\n\t" \
- - : "=r" (__res), "=&r" (__o0) \
- - : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \
- - : "cc"); \
- - __syscall_return(type, __res); \
- -}
- -
- -#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
- -type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
- -{ \
- - long __res; \
- - register long __g1 __asm__ ("g1") = __NR_##name; \
- - register long __o0 __asm__ ("o0") = (long)(arg1); \
- - register long __o1 __asm__ ("o1") = (long)(arg2); \
- - register long __o2 __asm__ ("o2") = (long)(arg3); \
- - register long __o3 __asm__ ("o3") = (long)(arg4); \
- - __asm__ __volatile__ ( \
- - "t 0x10\n\t" \
- - "bcc 1f\n\t" \
- - "mov %%o0, %0\n\t" \
- - "sub %%g0, %%o0, %0\n\t" \
- - "1:\n\t" \
- - : "=r" (__res), "=&r" (__o0) \
- - : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__g1) \
- - : "cc"); \
- - __syscall_return(type, __res); \
- -}
- -
- -#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
- - type5,arg5) \
- -type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
- -{ \
- - long __res; \
- - register long __g1 __asm__ ("g1") = __NR_##name; \
- - register long __o0 __asm__ ("o0") = (long)(arg1); \
- - register long __o1 __asm__ ("o1") = (long)(arg2); \
- - register long __o2 __asm__ ("o2") = (long)(arg3); \
- - register long __o3 __asm__ ("o3") = (long)(arg4); \
- - register long __o4 __asm__ ("o4") = (long)(arg5); \
- - __asm__ __volatile__ ( \
- - "t 0x10\n\t" \
- - "bcc 1f\n\t" \
- - "mov %%o0, %0\n\t" \
- - "sub %%g0, %%o0, %0\n\t" \
- - "1:\n\t" \
- - : "=r" (__res), "=&r" (__o0) \
- - : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__g1) \
- - : "cc"); \
- - __syscall_return(type, __res); \
- -}
- -
- -#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
- - type5,arg5,type6,arg6) \
- -type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \
- -{ \
- - long __res; \
- - register long __g1 __asm__ ("g1") = __NR_##name; \
- - register long __o0 __asm__ ("o0") = (long)(arg1); \
- - register long __o1 __asm__ ("o1") = (long)(arg2); \
- - register long __o2 __asm__ ("o2") = (long)(arg3); \
- - register long __o3 __asm__ ("o3") = (long)(arg4); \
- - register long __o4 __asm__ ("o4") = (long)(arg5); \
- - register long __o5 __asm__ ("o5") = (long)(arg6); \
- - __asm__ __volatile__ ( \
- - "t 0x10\n\t" \
- - "bcc 1f\n\t" \
- - "mov %%o0, %0\n\t" \
- - "sub %%g0, %%o0, %0\n\t" \
- - "1:\n\t" \
- - : "=r" (__res), "=&r" (__o0) \
- - : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__o5), "r" (__g1) \
- - : "cc"); \
- - __syscall_return(type, __res); \
- -}
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sparc/dl-sysdep.h uClibc-0.9.28/ldso/ldso/sparc/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/sparc/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sparc/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -1,9 +1,9 @@
- -
- +/* vi: set sw=4 ts=4: */
- /*
- * Various assmbly language/system dependent hacks that are required
- * so that we can minimize the amount of platform specific code.
- + * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
- */
- -#define LINUXBIN
-
- /* Define this if the system uses RELOCA. */
- #define ELF_USES_RELOCA
- @@ -31,19 +31,14 @@
- #undef MAGIC2
-
- /* Used for error messages */
- -#define ELF_TARGET "Sparc"
- +#define ELF_TARGET "sparc"
-
- -#ifndef COMPILE_ASM
- -extern unsigned int _dl_linux_resolver(unsigned int reloc_entry,
- - unsigned int * i);
- -#endif
- +struct elf_resolve;
- +unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
-
- /*
- * Define this if you want a dynamic loader that works on Solaris.
- */
- -#ifndef __linux__
- -#define SOLARIS_COMPATIBLE
- -#endif
-
- #ifndef COMPILE_ASM
- /* Cheap modulo implementation, taken from arm/ld_sysdep.h. */
- @@ -87,13 +82,6 @@
- #define do_rem(result, n, base) ((result) = sparc_mod(n, base))
- #endif
-
- -/*
- - * dbx wants the binder to have a specific name. Mustn't disappoint it.
- - */
- -#ifdef SOLARIS_COMPATIBLE
- -#define _dl_linux_resolve _elf_rtbndr
- -#endif
- -
- /* 4096 bytes alignment */
- /* ...but 8192 is required for mmap() on sparc64 kernel */
- #define PAGE_ALIGN 0xffffe000
- @@ -160,7 +148,7 @@
- elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
- Elf32_Word relative_count)
- {
- - Elf32_Rela * rpnt = (void *)rel_addr;
- + Elf32_Rela * rpnt = (void *)rel_addr;
- --rpnt;
- do {
- Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);
- diff -urN uClibc-0.9.28.orig/ldso/ldso/sparc/elfinterp.c uClibc-0.9.28/ldso/ldso/sparc/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/sparc/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/sparc/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -33,236 +33,340 @@
- an ELF sharable library or a linux style of shared library. */
-
- /* Disclaimer: I have never seen any AT&T source code for SVr4, nor have
- - I ever taken any courses on internals. This program was developed using
- - information available through the book "UNIX SYSTEM V RELEASE 4,
- - Programmers guide: Ansi C and Programming Support Tools", which did
- - a more than adequate job of explaining everything required to get this
- - working. */
- + I ever taken any courses on internals. This program was developed using
- + information available through the book "UNIX SYSTEM V RELEASE 4,
- + Programmers guide: Ansi C and Programming Support Tools", which did
- + a more than adequate job of explaining everything required to get this
- + working. */
- +
- +/* Some SPARC opcodes we need to use for self-modifying code. */
- +#define OPCODE_NOP 0x01000000 /* nop */
- +#define OPCODE_CALL 0x40000000 /* call ?; add PC-rel word address */
- +#define OPCODE_SETHI_G1 0x03000000 /* sethi ?, %g1; add value>>10 */
- +#define OPCODE_JMP_G1 0x81c06000 /* jmp %g1+?; add lo 10 bits of value */
- +#define OPCODE_SAVE_SP 0x9de3bfa8 /* save %sp, -(16+6)*4, %sp */
- +#define OPCODE_BA 0x30800000 /* b,a ?; add PC-rel word address */
-
- extern int _dl_linux_resolve(void);
-
- -unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt)
- +unsigned long
- +_dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
- {
- - int reloc_type;
- - Elf32_Rela * this_reloc;
- - char * strtab;
- - Elf32_Sym * symtab;
- - Elf32_Rela * rel_addr;
- - struct elf_resolve * tpnt;
- - int symtab_index;
- - char * new_addr;
- - char ** got_addr;
- - unsigned int instr_addr;
- - tpnt = (struct elf_resolve *) plt[2];
- -
- - rel_addr = (Elf32_Rela *)tpnt->dynamic_info[DT_JMPREL];
- -
- - /*
- - * Generate the correct relocation index into the .rela.plt section.
- - */
- - reloc_entry = (reloc_entry >> 10) - 0xc;
- -
- - this_reloc = (Elf32_Rela *) ((char *) rel_addr + reloc_entry);
- -
- - reloc_type = ELF32_R_TYPE(this_reloc->r_info);
- - symtab_index = ELF32_R_SYM(this_reloc->r_info);
- -
- - symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
- - strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
- -
- -#ifdef __SUPPORT_LD_DEBUG__
- - if (_dl_debug_symbols) {
- - _dl_dprintf(2, "tpnt = %x\n", tpnt);
- - _dl_dprintf(2, "reloc = %x\n", this_reloc);
- - _dl_dprintf(2, "symtab = %x\n", symtab);
- - _dl_dprintf(2, "strtab = %x\n", strtab);
- - }
- -#endif
- -
- -
- - if (unlikely(reloc_type != R_SPARC_JMP_SLOT)) {
- - _dl_dprintf(2, "%s: incorrect relocation type in jump relocations (%d)\n",
- - _dl_progname, reloc_type);
- - _dl_exit(30);
- - };
- -
- - /* Address of jump instruction to fix up */
- - instr_addr = ((int)this_reloc->r_offset + (int)tpnt->loadaddr);
- - got_addr = (char **) instr_addr;
- -
- -#ifdef __SUPPORT_LD_DEBUG__
- - if (_dl_debug_symbols) {
- - _dl_dprintf(2, "symtab_index %x\n", symtab_index);
- -
- - _dl_dprintf(2, "Resolving symbol %s\n",
- - strtab + symtab[symtab_index].st_name);
- - }
- -#endif
- -
- - /* Get the address of the GOT entry */
- - new_addr = _dl_find_hash(strtab + symtab[symtab_index].st_name,
- - tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT);
- - if(unlikely(!new_addr)) {
- - _dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
- - _dl_progname, strtab + symtab[symtab_index].st_name);
- - _dl_exit(31);
- - };
- + int reloc_type;
- + ELF_RELOC *this_reloc;
- + char *strtab;
- + ElfW(Sym) *symtab;
- + int symtab_index;
- + char *rel_addr;
- + char *new_addr;
- + char **got_addr;
- + ElfW(Addr) instr_addr;
- + char *symname;
- +
- + rel_addr = (char *)tpnt->dynamic_info[DT_JMPREL];
- + /*
- + * Generate the correct relocation index into the .rela.plt section.
- + */
- + reloc_entry = (reloc_entry >> 10) - 0xc;
- +
- + this_reloc = (ELF_RELOC *)(rel_addr + reloc_entry);
- + reloc_type = ELF_R_TYPE(this_reloc->r_info);
- + symtab_index = ELF_R_SYM(this_reloc->r_info);
- +
- + symtab = (ElfW(Sym) *)tpnt->dynamic_info[DT_SYMTAB];
- + strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
- + symname = strtab + symtab[symtab_index].st_name;
- +
- + if (unlikely(reloc_type != R_SPARC_JMP_SLOT)) {
- + _dl_dprintf(2, "%s: Incorrect relocation type in jump relocations\n",
- + _dl_progname);
- + _dl_exit(1);
- + }
- +
- + /* Address of the jump instruction to fix up. */
- + instr_addr = (this_reloc->r_offset + tpnt->loadaddr);
- + got_addr = (char **)instr_addr;
- +
- + /* Get the address of the GOT entry */
- + new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt, ELF_RTYPE_CLASS_PLT);
- + if (unlikely(!new_addr)) {
- + _dl_dprintf(2, "%s: Can't resolve symbol '%s'\n", _dl_progname, symname);
- + _dl_exit(1);
- + }
-
- #if defined (__SUPPORT_LD_DEBUG__)
- - if ((unsigned long) got_addr < 0x40000000)
- - {
- - if (_dl_debug_bindings)
- - {
- - _dl_dprintf(_dl_debug_file, "\nresolve function: %s",
- - strtab + symtab[symtab_index].st_name);
- - if(_dl_debug_detail) _dl_dprintf(_dl_debug_file,
- - "\tpatch %x ==> %x @ %x", *got_addr, new_addr, got_addr);
- + if ((unsigned long)got_addr < 0x40000000) {
- + if (_dl_debug_bindings) {
- + _dl_dprintf(_dl_debug_file, "\nresolve function: %s", symname);
- + if (_dl_debug_detail)
- + _dl_dprintf(_dl_debug_file,
- + "\tpatched: %x ==> %x @ %x\n",
- + *got_addr, new_addr, got_addr);
- }
- }
- - if (!_dl_debug_nofixups) {
- + if (!_dl_debug_nofixups)
- +#endif
- + {
- got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff));
- got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff));
- }
- +
- + return (unsigned long)new_addr;
- +}
- +
- +static int
- +_dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + unsigned long rel_addr, unsigned long rel_size,
- + int (*reloc_fnc)(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab))
- +{
- + unsigned int i;
- + char *strtab;
- + ElfW(Sym) *symtab;
- + ELF_RELOC *rpnt;
- + int symtab_index;
- +
- + /* Parse the relocation information. */
- + rpnt = (ELF_RELOC *)rel_addr;
- + rel_size /= sizeof(ELF_RELOC);
- +
- + symtab = (ElfW(Sym) *)tpnt->dynamic_info[DT_SYMTAB];
- + strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
- +
- + for (i = 0; i < rel_size; i++, rpnt++) {
- + int res;
- +
- + symtab_index = ELF_R_SYM(rpnt->r_info);
- +
- + debug_sym(symtab, strtab, symtab_index);
- + debug_reloc(symtab, strtab, rpnt);
- +
- + res = reloc_fnc(tpnt, scope, rpnt, symtab, strtab);
- +
- + if (res == 0)
- + continue;
- +
- + _dl_dprintf(2, "\n%s: ", _dl_progname);
- +
- + if (symtab_index)
- + _dl_dprintf(2, "symbol '%s': ",
- + strtab + symtab[symtab_index].st_name);
- +
- + if (unlikely(res < 0)) {
- + int reloc_type = ELF_R_TYPE(rpnt->r_info);
- +
- + _dl_dprintf(2, "can't handle reloc type "
- +#if defined (__SUPPORT_LD_DEBUG__)
- + "%s\n", _dl_reltypes(reloc_type));
- #else
- - got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff));
- - got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff));
- + "%x\n", reloc_type);
- #endif
- + _dl_exit(-res);
- + } else if (unlikely(res > 0)) {
- + _dl_dprintf(2, "can't resolve symbol\n");
- + return res;
- + }
- + }
- +
- + return 0;
- +}
-
- - _dl_dprintf(2, "Address = %x\n",new_addr);
- - _dl_exit(32);
- +static int
- +_dl_do_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab)
- +{
- + int reloc_type;
- + int symtab_index;
- + char *symname;
- + ElfW(Sym) *sym;
- + ElfW(Addr) *reloc_addr;
- + ElfW(Addr) symbol_addr;
- +#if defined (__SUPPORT_LD_DEBUG__)
- + ElfW(Addr) old_val;
- +#endif
- +
- + reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + (unsigned long)rpnt->r_offset);
- + reloc_type = ELF_R_TYPE(rpnt->r_info);
- + symtab_index = ELF_R_SYM(rpnt->r_info);
- + sym = &symtab[symtab_index];
- + symbol_addr = 0;
- + symname = strtab + sym->st_name;
- +
- + if (symtab_index) {
- + symbol_addr = (ElfW(Addr))_dl_find_hash(symname, scope, tpnt,
- + elf_machine_type_class(reloc_type));
- + /*
- + * We want to allow undefined references to weak symbols - this
- + * might have been intentional. We should not be linking local
- + * symbols here, so all bases should be covered.
- + */
- + if (unlikely(!symbol_addr && ELF_ST_BIND(sym->st_info) != STB_WEAK)) {
- + _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
- + _dl_exit(1);
- + }
- + }
- +
- +#if defined (__SUPPORT_LD_DEBUG__)
- + old_val = *reloc_addr;
- +#endif
-
- - return (unsigned int) new_addr;
- + symbol_addr += rpnt->r_addend; /* Assume copy relocs have zero addend. */
- +
- + switch (reloc_type) {
- + case R_SPARC_NONE:
- + break;
- +
- +#if 0 /* these dont really seem to be useful */
- + case R_SPARC_8:
- + *(char *) reloc_addr = symbol_addr;
- + break;
- + case R_SPARC_16:
- + *(short *) reloc_addr = symbol_addr;
- + break;
- + case R_SPARC_DISP8:
- + *(char *) reloc_addr = (symbol_addr) - (Elf32_Addr) reloc_addr;
- + break;
- + case R_SPARC_DISP16:
- + *(short *) reloc_addr = (symbol_addr) - (Elf32_Addr) reloc_addr;
- + break;
- +#endif
- +
- + case R_SPARC_DISP32:
- + *reloc_addr = symbol_addr - (unsigned int) reloc_addr;
- + break;
- +
- + case R_SPARC_LO10:
- + if (!symbol_addr)
- + symbol_addr = tpnt->loadaddr + rpnt->r_addend;
- + else
- + symbol_addr += rpnt->r_addend;
- + *reloc_addr = (*reloc_addr & ~0x3ff)|(symbol_addr & 0x3ff);
- + break;
- +
- + case R_SPARC_GLOB_DAT:
- + case R_SPARC_32:
- + *reloc_addr = symbol_addr;
- + break;
- +
- + case R_SPARC_JMP_SLOT:
- +/*
- +value = symbol_addr;
- +value += reloc->r_addend;
- +disp = value - reloc_addr;
- +reloc_addr[1] = OPCODE_JMP_G1 | (value & 0x3ff);
- +reloc_addr[0] = OPCODE_SETHI_G1 | (value >> 10);
- + reloc_addr[1] = OPCODE_JMP_G1 | ((symbol_addr-(Elf32_Addr)reloc_addr) & 0x3ff);
- + reloc_addr[0] = OPCODE_SETHI_G1 | ((symbol_addr-(Elf32_Addr)reloc_addr) >> 10);
- +*/
- + reloc_addr[1] = 0x03000000 | ((symbol_addr >> 10) & 0x3fffff);
- + reloc_addr[2] = 0x81c06000 | (symbol_addr & 0x3ff);
- + break;
- +
- + case R_SPARC_RELATIVE:
- + *reloc_addr += tpnt->loadaddr + rpnt->r_addend;
- + break;
- +
- + case R_SPARC_WDISP30:
- + *reloc_addr = (*reloc_addr & 0xc0000000)|
- + ((symbol_addr - (unsigned int) reloc_addr) >> 2);
- + break;
- +
- + case R_SPARC_HI22:
- + if (!symbol_addr)
- + symbol_addr = tpnt->loadaddr + rpnt->r_addend;
- + else
- + symbol_addr += rpnt->r_addend;
- + *reloc_addr = (*reloc_addr & 0xffc00000) | (symbol_addr >> 10);
- + break;
- +
- + case R_SPARC_COPY:
- + if (symbol_addr) {
- +#if defined (__SUPPORT_LD_DEBUG__)
- + if (_dl_debug_move)
- + _dl_dprintf(_dl_debug_file,
- + "\t%s move %d bytes from %x to %x\n",
- + symname, sym->st_size,
- + symbol_addr, reloc_addr);
- +#endif
- +
- + _dl_memcpy((char *)reloc_addr,
- + (char *)symbol_addr,
- + sym->st_size);
- + } else
- + _dl_dprintf(_dl_debug_file, "no symbol_addr to copy !?\n");
- + break;
- + default:
- + return -1; /* Calls _dl_exit(1). */
- + }
- +
- +#if defined (__SUPPORT_LD_DEBUG__)
- + if (_dl_debug_reloc && _dl_debug_detail)
- + _dl_dprintf(_dl_debug_file, "\tpatched: %x ==> %x @ %x\n",
- + old_val, *reloc_addr, reloc_addr);
- +#endif
- +
- + return 0;
- +}
- +
- +#undef __SPARC_LAZY_RELOC_WORKS
- +#ifdef __SPARC_LAZY_RELOC_WORKS
- +static int
- +_dl_do_lazy_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
- + ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab)
- +{
- + int reloc_type;
- + int symtab_index;
- + ElfW(Addr) *reloc_addr;
- +#if defined (__SUPPORT_LD_DEBUG__)
- + ElfW(Addr) old_val;
- +#endif
- +
- + (void)scope;
- + symtab_index = ELF_R_SYM(rpnt->r_info);
- + (void)strtab;
- +
- + reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + rpnt->r_offset);
- + reloc_type = ELF_R_TYPE(rpnt->r_info);
- +
- +#if defined (__SUPPORT_LD_DEBUG__)
- + old_val = *reloc_addr;
- +#endif
- +
- + switch (reloc_type) {
- + case R_SPARC_NONE:
- + break;
- + case R_SPARC_JMP_SLOT:
- + break;
- + default:
- + _dl_exit(1);
- + }
- +
- +#if defined (__SUPPORT_LD_DEBUG__)
- + if (_dl_debug_reloc && _dl_debug_detail)
- + _dl_dprintf(_dl_debug_file, "\tpatched_lazy: %x ==> %x @ %x\n",
- + old_val, *reloc_addr, reloc_addr);
- +#endif
- +
- + return 0;
- }
- +#endif
-
- -void _dl_parse_lazy_relocation_information(struct dyn_elf *arg_rpnt,
- - unsigned long rel_addr, unsigned long rel_size)
- -{
- - int i;
- - char * strtab;
- - int reloc_type;
- - int symtab_index;
- - Elf32_Sym * symtab;
- - Elf32_Rela * rpnt;
- - unsigned int * reloc_addr;
- - struct elf_resolve * tpnt = arg_rpnt->dyn;
- -
- - /* Now parse the relocation information */
- - rpnt = (Elf32_Rela *)rel_addr;
- -
- - symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
- - strtab = ( char *)tpnt->dynamic_info[DT_STRTAB];
- -
- - for(i=0; i< rel_size; i += sizeof(Elf32_Rela), rpnt++){
- - reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);
- - reloc_type = ELF32_R_TYPE(rpnt->r_info);
- - symtab_index = ELF32_R_SYM(rpnt->r_info);
- -
- - switch(reloc_type){
- - case R_SPARC_NONE:
- - break;
- - case R_SPARC_JMP_SLOT:
- - break;
- - default:
- - _dl_dprintf(2, "%s: (LAZY) can't handle reloc type ", _dl_progname);
- -#if defined (__SUPPORT_LD_DEBUG__)
- - _dl_dprintf(2, "%s ", _dl_reltypes_tab[reloc_type]);
- -#endif
- - if(symtab_index) _dl_dprintf(2, "'%s'\n",
- - strtab + symtab[symtab_index].st_name);
- - _dl_exit(33);
- - };
- - };
- -}
- -
- -int _dl_parse_relocation_information(struct dyn_elf *arg_rpnt,
- - unsigned long rel_addr, unsigned long rel_size)
- -{
- - int i;
- - char * strtab;
- - int reloc_type;
- - int goof = 0;
- - Elf32_Sym * symtab;
- - Elf32_Rela * rpnt;
- - unsigned int * reloc_addr;
- - unsigned int symbol_addr;
- - int symtab_index;
- - struct elf_resolve * tpnt = arg_rpnt->dyn;
- - /* Now parse the relocation information */
- -
- - rpnt = (Elf32_Rela *)rel_addr;
- -
- - symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
- - strtab = ( char *)tpnt->dynamic_info[DT_STRTAB];
- -
- - for(i=0; i< rel_size; i+= sizeof(Elf32_Rela), rpnt++){
- - reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);
- - reloc_type = ELF32_R_TYPE(rpnt->r_info);
- - symtab_index = ELF32_R_SYM(rpnt->r_info);
- - symbol_addr = 0;
- -
- - if(symtab_index) {
- -
- - symbol_addr = (unsigned int)
- - _dl_find_hash(strtab + symtab[symtab_index].st_name,
- - tpnt->symbol_scope, tpnt, elf_machine_type_class(reloc_type));
- -
- - if(!symbol_addr &&
- - ELF32_ST_BIND(symtab [symtab_index].st_info) != STB_WEAK) {
- - _dl_dprintf (2, "%s: can't resolve symbol '%s'\n",
- - _dl_progname, strtab + symtab[symtab_index].st_name);
- - _dl_exit (1);
- - };
- - };
- - switch(reloc_type){
- - case R_SPARC_NONE:
- - break;
- - case R_SPARC_32:
- - *reloc_addr = symbol_addr + rpnt->r_addend;
- - break;
- - case R_SPARC_DISP32:
- - *reloc_addr = symbol_addr + rpnt->r_addend - (unsigned int) reloc_addr;
- - break;
- - case R_SPARC_GLOB_DAT:
- - *reloc_addr = symbol_addr + rpnt->r_addend;
- - break;
- - case R_SPARC_JMP_SLOT:
- - reloc_addr[1] = 0x03000000 | ((symbol_addr >> 10) & 0x3fffff);
- - reloc_addr[2] = 0x81c06000 | (symbol_addr & 0x3ff);
- - break;
- - case R_SPARC_RELATIVE:
- - *reloc_addr += (unsigned int) tpnt->loadaddr + rpnt->r_addend;
- - break;
- - case R_SPARC_HI22:
- - if (!symbol_addr)
- - symbol_addr = tpnt->loadaddr + rpnt->r_addend;
- - else
- - symbol_addr += rpnt->r_addend;
- - *reloc_addr = (*reloc_addr & 0xffc00000)|(symbol_addr >> 10);
- - break;
- - case R_SPARC_LO10:
- - if (!symbol_addr)
- - symbol_addr = tpnt->loadaddr + rpnt->r_addend;
- - else
- - symbol_addr += rpnt->r_addend;
- - *reloc_addr = (*reloc_addr & ~0x3ff)|(symbol_addr & 0x3ff);
- - break;
- - case R_SPARC_WDISP30:
- - *reloc_addr = (*reloc_addr & 0xc0000000)|
- - ((symbol_addr - (unsigned int) reloc_addr) >> 2);
- - break;
- - case R_SPARC_COPY:
- - _dl_memcpy((void *) reloc_addr, (void *) symbol_addr, symtab[symtab_index].st_size);
- - break;
- - default:
- - _dl_dprintf(2, "%s: can't handle reloc type ", _dl_progname);
- -#if defined (__SUPPORT_LD_DEBUG__)
- - _dl_dprintf(2, "%s ", _dl_reltypes_tab[reloc_type]);
- -#endif
- - if (symtab_index)
- - _dl_dprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
- - _dl_exit(34);
- - };
- +void
- +_dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
- + unsigned long rel_addr,
- + unsigned long rel_size)
- +{
- +#ifdef __SPARC_LAZY_RELOC_WORKS
- + (void)_dl_parse(rpnt->dyn, NULL, rel_addr, rel_size, _dl_do_lazy_reloc);
- +#else
- + _dl_parse_relocation_information(rpnt, rel_addr, rel_size);
- +#endif
- +}
-
- - };
- - return goof;
- +int
- +_dl_parse_relocation_information(struct dyn_elf *rpnt,
- + unsigned long rel_addr,
- + unsigned long rel_size)
- +{
- + return _dl_parse(rpnt->dyn, rpnt->dyn->symbol_scope, rel_addr, rel_size, _dl_do_reloc);
- }
- diff -urN uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-debug.h uClibc-0.9.28/ldso/ldso/x86_64/dl-debug.h
- --- uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-debug.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/x86_64/dl-debug.h 2006-04-28 00:14:35.000000000 -0600
- @@ -30,7 +30,10 @@
- */
-
- static const char *_dl_reltypes_tab[] = {
- - [0] "R_X86_64_NONE", "R_X86_64_64", "R_X86_64_PC32", "R_X86_64_GOT32",
- - [4] "R_X86_64_PLT32", "R_X86_64_COPY", "R_X86_64_GLOB_DAT", "R_X86_64_JUMP_SLOT",
- - [8] "R_X86_64_RELATIVE", "R_X86_64_GOTPCREL", "R_X86_64_32"
- + [ 0] "R_X86_64_NONE", "R_X86_64_64", "R_X86_64_PC32", "R_X86_64_GOT32",
- + [ 4] "R_X86_64_PLT32", "R_X86_64_COPY", "R_X86_64_GLOB_DAT", "R_X86_64_JUMP_SLOT",
- + [ 8] "R_X86_64_RELATIVE", "R_X86_64_GOTPCREL", "R_X86_64_32", "R_X86_64_32S",
- + [12] "R_X86_64_16", "R_X86_64_PC16", "R_X86_64_8", "R_X86_64_PC8",
- + [16] "R_X86_64_DTPMOD64", "R_X86_64_DTPOFF64", "R_X86_64_TPOFF64", "R_X86_64_TLSGD",
- + [20] "R_X86_64_TLSLD", "R_X86_64_DTPOFF32", "R_X86_64_GOTTPOFF", "R_X86_64_TPOFF32"
- };
- diff -urN uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-startup.h uClibc-0.9.28/ldso/ldso/x86_64/dl-startup.h
- --- uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-startup.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/x86_64/dl-startup.h 2006-04-28 00:14:35.000000000 -0600
- @@ -6,7 +6,7 @@
- *
- * Parts taken from glibc/sysdeps/x86_64/dl-machine.h
- */
- -asm(
- +__asm__ (
- " .text\n"
- " .align 16\n"
- " .global _start\n"
- @@ -42,10 +42,10 @@
-
- /* Handle relocation of the symbols in the dynamic loader. */
- static __always_inline
- -void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
- - unsigned long symbol_addr, unsigned long load_addr, Elf64_Sym *sym)
- +void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, ElfW(Addr) *reloc_addr,
- + ElfW(Addr) symbol_addr, ElfW(Addr) load_addr, ElfW(Sym) *sym)
- {
- - switch (ELF64_R_TYPE(rpnt->r_info)) {
- + switch (ELF_R_TYPE(rpnt->r_info)) {
- case R_X86_64_GLOB_DAT:
- case R_X86_64_JUMP_SLOT:
- *reloc_addr = symbol_addr + rpnt->r_addend;
- @@ -63,8 +63,3 @@
- _dl_exit(1);
- }
- }
- -
- -/* Transfer control to the user's application, once the dynamic loader is
- - * done. This routine has to exit the current function, then call the
- - * _dl_elf_main function. */
- -#define START() return _dl_elf_main
- diff -urN uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-syscalls.h uClibc-0.9.28/ldso/ldso/x86_64/dl-syscalls.h
- --- uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/x86_64/dl-syscalls.h 2006-05-02 13:39:17.000000000 -0600
- @@ -1,7 +1,8 @@
- /* We can't use the real errno in ldso, since it has not yet
- * been dynamicly linked in yet. */
- +#define __UCLIBC_MMAP_HAS_6_ARGS__
- +
- +#include "sys/syscall.h"
- extern int _dl_errno;
- +#undef __set_errno
- #define __set_errno(X) {(_dl_errno) = (X);}
- -#include "sys/syscall.h"
- -
- -#define MMAP_HAS_6_ARGS
- diff -urN uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-sysdep.h uClibc-0.9.28/ldso/ldso/x86_64/dl-sysdep.h
- --- uClibc-0.9.28.orig/ldso/ldso/x86_64/dl-sysdep.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/x86_64/dl-sysdep.h 2006-04-28 00:14:35.000000000 -0600
- @@ -41,8 +41,6 @@
- struct elf_resolve;
- extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
-
- -#define do_rem(result, n, base) ((result) = (n) % (base))
- -
- /* 4096 bytes alignment */
- #define PAGE_ALIGN 0xfffff000
- #define ADDR_ALIGN 0xfff
- @@ -90,7 +88,7 @@
- and compare it with the current value that we can get via
- an RIP relative addressing mode. */
-
- - asm ("movq 1f(%%rip), %1\n"
- + __asm__ ("movq 1f(%%rip), %1\n"
- "0:\tleaq _dl_start(%%rip), %0\n\t"
- "subq %1, %0\n\t"
- ".section\t.data\n"
- diff -urN uClibc-0.9.28.orig/ldso/ldso/x86_64/elfinterp.c uClibc-0.9.28/ldso/ldso/x86_64/elfinterp.c
- --- uClibc-0.9.28.orig/ldso/ldso/x86_64/elfinterp.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/ldso/x86_64/elfinterp.c 2006-04-28 00:14:35.000000000 -0600
- @@ -165,6 +165,7 @@
- int reloc_type;
- int symtab_index;
- char *symname;
- + ElfW(Sym) *sym;
- ElfW(Addr) *reloc_addr;
- ElfW(Addr) symbol_addr;
- #if defined (__SUPPORT_LD_DEBUG__)
- @@ -174,8 +175,9 @@
- reloc_addr = (ElfW(Addr)*)(tpnt->loadaddr + (unsigned long)rpnt->r_offset);
- reloc_type = ELF_R_TYPE(rpnt->r_info);
- symtab_index = ELF_R_SYM(rpnt->r_info);
- + sym = &symtab[symtab_index];
- symbol_addr = 0;
- - symname = strtab + symtab[symtab_index].st_name;
- + symname = strtab + sym->st_name;
-
- if (symtab_index) {
- symbol_addr = (ElfW(Addr))_dl_find_hash(symname, scope, tpnt,
- @@ -185,7 +187,7 @@
- * might have been intentional. We should not be linking local
- * symbols here, so all bases should be covered.
- */
- - if (unlikely(!symbol_addr && ELF_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) {
- + if (unlikely(!symbol_addr && ELF_ST_BIND(sym->st_info) != STB_WEAK)) {
- _dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
- _dl_exit(1);
- };
- @@ -209,7 +211,7 @@
-
- case R_X86_64_GLOB_DAT:
- case R_X86_64_JUMP_SLOT:
- - *reloc_addr = symbol_addr;
- + *reloc_addr = symbol_addr + rpnt->r_addend;
- break;
-
- /* handled by elf_machine_relative()
- @@ -217,33 +219,33 @@
- *reloc_addr = map->l_addr + rpnt->r_addend;
- break;
- */
- -#if 0
- case R_X86_64_DTPMOD64:
- + *reloc_addr = 1;
- break;
- case R_X86_64_DTPOFF64:
- - *reloc_addr = symbol_addr + rpnt->r_addend;
- + *reloc_addr = sym->st_value + rpnt->r_addend;
- break;
- case R_X86_64_TPOFF64:
- - *reloc_addr = symbol_addr + rpnt->r_addend;
- + *reloc_addr = sym->st_value + rpnt->r_addend - symbol_addr;
- break;
- case R_X86_64_32:
- - *reloc_addr = symbol_addr + rpnt->r_addend;
- + *(unsigned int *) reloc_addr = symbol_addr + rpnt->r_addend;
- + /* XXX: should check for overflow eh ? */
- break;
-
- -#endif
- case R_X86_64_COPY:
- if (symbol_addr) {
- #if defined (__SUPPORT_LD_DEBUG__)
- if (_dl_debug_move)
- _dl_dprintf(_dl_debug_file,
- "\t%s move %d bytes from %x to %x\n",
- - symname, symtab[symtab_index].st_size,
- + symname, sym->st_size,
- symbol_addr, reloc_addr);
- #endif
-
- _dl_memcpy((char *)reloc_addr,
- (char *)symbol_addr,
- - symtab[symtab_index].st_size);
- + sym->st_size);
- } else
- _dl_dprintf(_dl_debug_file, "no symbol_addr to copy !?\n");
- break;
- @@ -261,7 +263,6 @@
- return 0;
- }
-
- -#if 0
- static int
- _dl_do_lazy_reloc(struct elf_resolve *tpnt, struct dyn_elf *scope,
- ELF_RELOC *rpnt, ElfW(Sym) *symtab, char *strtab)
- @@ -288,7 +289,7 @@
- case R_X86_64_NONE:
- break;
- case R_X86_64_JUMP_SLOT:
- - *reloc_addr = tpnt->loadaddr + symtab[symtab_index].st_value;
- + *reloc_addr += (unsigned long)tpnt->loadaddr;
- break;
- default:
- _dl_exit(1);
- @@ -302,17 +303,13 @@
-
- return 0;
- }
- -#endif
-
- void
- _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
- unsigned long rel_addr,
- unsigned long rel_size)
- {
- - _dl_parse_relocation_information(rpnt, rel_addr, rel_size);
- -/* jump slot isnt working
- (void)_dl_parse(rpnt->dyn, NULL, rel_addr, rel_size, _dl_do_lazy_reloc);
- -*/
- }
-
- int
- diff -urN uClibc-0.9.28.orig/ldso/ldso/x86_64/resolve.S uClibc-0.9.28/ldso/ldso/x86_64/resolve.S
- --- uClibc-0.9.28.orig/ldso/ldso/x86_64/resolve.S 1969-12-31 17:00:00.000000000 -0700
- +++ uClibc-0.9.28/ldso/ldso/x86_64/resolve.S 2006-04-28 00:14:35.000000000 -0600
- @@ -0,0 +1,63 @@
- +/*
- + * This function is _not_ called directly. It is jumped to (so no return
- + * address is on the stack) when attempting to use a symbol that has not yet
- + * been resolved. The first time a jump symbol (such as a function call inside
- + * a shared library) is used (before it gets resolved) it will jump here to
- + * _dl_linux_resolve. When we get called the stack looks like this:
- + * reloc_entry
- + * tpnt
- + *
- + * This function saves all the registers, puts a copy of reloc_entry and tpnt
- + * on the stack (as function arguments) then make the function call
- + * _dl_linux_resolver(tpnt, reloc_entry). _dl_linux_resolver() figures out
- + * where the jump symbol is _really_ supposed to have jumped to and returns
- + * that to us. Once we have that, we overwrite tpnt with this fixed up
- + * address. We then clean up after ourselves, put all the registers back how we
- + * found them, then we jump to where the fixed up address, which is where the
- + * jump symbol that got us here really wanted to jump to in the first place.
- + * found them, then we jump to the fixed up address, which is where the jump
- + * symbol that got us here really wanted to jump to in the first place.
- + * -Erik Andersen
- + */
- +
- +/* more info taken from glibc/sysdeps/x86_64/dl-trampoline.S */
- +
- +.text
- +
- +.global _dl_linux_resolve
- +.type _dl_linux_resolve,%function
- +.align 16
- +
- +_dl_linux_resolve:
- + subq $56,%rsp
- + /* Preserve registers otherwise clobbered. */
- + movq %rax, (%rsp)
- + movq %rcx, 8(%rsp)
- + movq %rdx, 16(%rsp)
- + movq %rsi, 24(%rsp)
- + movq %rdi, 32(%rsp)
- + movq %r8, 40(%rsp)
- + movq %r9, 48(%rsp)
- +
- + movq 64(%rsp), %rsi /* Copy args pushed by PLT in register. */
- + movq %rsi, %r11 /* Multiply by 24 */
- + addq %r11, %rsi
- + addq %r11, %rsi
- + shlq $3, %rsi
- + movq 56(%rsp), %rdi /* %rdi: link_map, %rsi: reloc_offset */
- + call _dl_linux_resolver /* Call resolver. */
- + movq %rax, %r11 /* Save return value */
- +
- + /* Get register content back. */
- + movq 48(%rsp), %r9
- + movq 40(%rsp), %r8
- + movq 32(%rsp), %rdi
- + movq 24(%rsp), %rsi
- + movq 16(%rsp), %rdx
- + movq 8(%rsp), %rcx
- + movq (%rsp), %rax
- +
- + addq $72, %rsp /* Adjust stack(PLT did 2 pushes) */
- + jmp *%r11 /* Jump to function address. */
- +
- +.size _dl_linux_resolve,.-_dl_linux_resolve
- diff -urN uClibc-0.9.28.orig/ldso/libdl/Makefile uClibc-0.9.28/ldso/libdl/Makefile
- --- uClibc-0.9.28.orig/ldso/libdl/Makefile 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/libdl/Makefile 2006-04-28 00:14:35.000000000 -0600
- @@ -29,12 +29,14 @@
- endif
- XXFLAGS+= $(XARCH_CFLAGS) $(CPU_CFLAGS) \
- -DUCLIBC_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \
- - -fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)ldso/include -I$(TOPDIR)ldso/ldso -I. -I$(TOPDIR)include
- + -fno-builtin -nostdinc -D_LIBC \
- + -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\" \
- + -I$(TOPDIR)ldso/ldso/$(TARGET_ARCH) -I$(TOPDIR)ldso/include -I$(TOPDIR)ldso/ldso -I$(TOPDIR)include
-
- XXFLAGS+=-isystem $(shell $(CC) -print-file-name=include)
- XXFLAGS_NOPIC:=$(XXFLAGS)
- ifeq ($(DOPIC),y)
- - XXFLAGS += $(PICFLAG) -D__LIBDL_SHARED__
- + XXFLAGS += $(PICFLAG) -DSHARED
- endif
- ifeq ($(strip $(SUPPORT_LD_DEBUG)),y)
- XXFLAGS+=-D__SUPPORT_LD_DEBUG__
- diff -urN uClibc-0.9.28.orig/ldso/libdl/libdl.c uClibc-0.9.28/ldso/libdl/libdl.c
- --- uClibc-0.9.28.orig/ldso/libdl/libdl.c 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/ldso/libdl/libdl.c 2006-04-28 00:14:35.000000000 -0600
- @@ -3,7 +3,7 @@
- * Program to load an ELF binary on a linux system, and run it
- * after resolving ELF shared library symbols
- *
- - * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
- + * Copyright (C) 2000-2006 by Erik Andersen <andersen@uclibc.org>
- * Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald,
- * David Engel, Hongjiu Lu and Mitch D'Souza
- *
- @@ -30,12 +30,12 @@
- */
-
-
- -#define _GNU_SOURCE
- +#define _GNU_SOURCE
- #include <ldso.h>
- #include <stdio.h>
-
-
- -#if defined (__LIBDL_SHARED__)
- +#ifdef SHARED
-
- /* When libdl is loaded as a shared library, we need to load in
- * and use a pile of symbols from ldso... */
- @@ -52,6 +51,8 @@
- extern struct r_debug *_dl_debug_addr;
- extern unsigned long _dl_error_number;
- extern void *(*_dl_malloc_function)(size_t);
- +extern void _dl_run_init_array(struct elf_resolve *);
- +extern void _dl_run_fini_array(struct elf_resolve *);
- #ifdef __LDSO_CACHE_SUPPORT__
- int _dl_map_cache(void);
- int _dl_unmap_cache(void);
- @@ -64,7 +65,7 @@
- #endif
-
-
- -#else /* __LIBDL_SHARED__ */
- +#else /* SHARED */
-
- /* When libdl is linked as a static library, we need to replace all
- * the symbols that otherwise would have been loaded in from ldso... */
- @@ -81,11 +82,11 @@
- struct r_debug *_dl_debug_addr = NULL;
- #define _dl_malloc malloc
- #include "../ldso/dl-debug.c"
- -#include "dl-progname.h"
- +#include LDSO_ELFINTERP
- #include "../ldso/dl-hash.c"
- #define _dl_trace_loaded_objects 0
- #include "../ldso/dl-elf.c"
- -#endif /* __LIBDL_SHARED__ */
- +#endif /* SHARED */
-
- #ifdef __SUPPORT_LD_DEBUG__
- # define _dl_if_debug_print(fmt, args...) \
- @@ -126,7 +127,8 @@
- "Unable to resolve symbol"
- };
-
- -void __attribute__ ((destructor)) dl_cleanup(void)
- +void dl_cleanup(void) __attribute__ ((destructor));
- +void dl_cleanup(void)
- {
- struct dyn_elf *d;
- for (d = _dl_handles; d; d = d->next_handle) {
- @@ -138,13 +140,12 @@
- {
- struct elf_resolve *tpnt, *tfrom;
- struct dyn_elf *dyn_chain, *rpnt = NULL, *dyn_ptr, *relro_ptr, *handle;
- - struct dyn_elf *dpnt;
- ElfW(Addr) from;
- struct elf_resolve *tpnt1;
- void (*dl_brk) (void);
- int now_flag;
- struct init_fini_list *tmp, *runp, *runp2, *dep_list;
- - int nlist, i;
- + unsigned int nlist, i;
- struct elf_resolve **init_fini_list;
-
- /* A bit of sanity checking... */
- @@ -169,12 +170,15 @@
- * the application. Thus this may go away at some time
- * in the future.
- */
- - tfrom = NULL;
- - for (dpnt = _dl_symbol_tables; dpnt; dpnt = dpnt->next) {
- - tpnt = dpnt->dyn;
- - if (tpnt->loadaddr < from
- - && (tfrom == NULL || tfrom->loadaddr < tpnt->loadaddr))
- - tfrom = tpnt;
- + {
- + struct dyn_elf *dpnt;
- + tfrom = NULL;
- + for (dpnt = _dl_symbol_tables; dpnt; dpnt = dpnt->next) {
- + tpnt = dpnt->dyn;
- + if (tpnt->loadaddr < from
- + && (tfrom == NULL || tfrom->loadaddr < tpnt->loadaddr))
- + tfrom = tpnt;
- + }
- }
- for(rpnt = _dl_symbol_tables; rpnt && rpnt->next; rpnt=rpnt->next);
-
- @@ -233,11 +237,8 @@
- runp->tpnt->init_fini = NULL; /* clear any previous dependcies */
- for (dpnt = (ElfW(Dyn) *) runp->tpnt->dynamic_addr; dpnt->d_tag; dpnt++) {
- if (dpnt->d_tag == DT_NEEDED) {
- - char *name;
- -
- lpntstr = (char*) (runp->tpnt->dynamic_info[DT_STRTAB] +
- dpnt->d_un.d_val);
- - name = _dl_get_last_path_component(lpntstr);
- _dl_if_debug_print("Trying to load '%s', needed by '%s'\n",
- lpntstr, runp->tpnt->libname);
- tpnt1 = _dl_load_shared_library(0, &rpnt, runp->tpnt, lpntstr, 0);
- @@ -297,14 +298,14 @@
- }
- /* Sort the INIT/FINI list in dependency order. */
- for (runp2 = dep_list; runp2; runp2 = runp2->next) {
- - int j, k;
- + unsigned int j, k;
- for (j = 0; init_fini_list[j] != runp2->tpnt; ++j)
- /* Empty */;
- for (k = j + 1; k < nlist; ++k) {
- - struct init_fini_list *runp = init_fini_list[k]->init_fini;
- + struct init_fini_list *ele = init_fini_list[k]->init_fini;
-
- - for (; runp; runp = runp->next) {
- - if (runp->tpnt == runp2->tpnt) {
- + for (; ele; ele = ele->next) {
- + if (ele->tpnt == runp2->tpnt) {
- struct elf_resolve *here = init_fini_list[k];
- _dl_if_debug_print("Move %s from pos %d to %d in INIT/FINI list.\n", here->libname, k, j);
- for (i = (k - j); i; --i)
- @@ -367,7 +368,7 @@
- }
- }
-
- -#if defined (__LIBDL_SHARED__)
- +#ifdef SHARED
- /* Run the ctors and setup the dtors */
- for (i = nlist; i; --i) {
- tpnt = init_fini_list[i-1];
- @@ -384,8 +385,11 @@
- (*dl_elf_func) ();
- }
- }
- +
- + _dl_run_init_array(tpnt);
- }
- -#endif
- +#endif /* SHARED */
- +
- _dl_unmap_cache();
- return (void *) dyn_chain;
-
- @@ -450,9 +454,16 @@
- return ret;
- }
-
- +#if 0
- +void *dlvsym(void *vhandle, const char *name, const char *version)
- +{
- + return dlsym(vhandle, name);
- +}
- +#endif
- +
- static int do_dlclose(void *vhandle, int need_fini)
- {
- - struct dyn_elf *rpnt, *rpnt1;
- + struct dyn_elf *rpnt, *rpnt1, *rpnt1_tmp;
- struct init_fini_list *runp, *tmp;
- ElfW(Phdr) *ppnt;
- struct elf_resolve *tpnt, *run_tpnt;
- @@ -460,7 +471,7 @@
- void (*dl_brk) (void);
- struct dyn_elf *handle;
- unsigned int end;
- - int i = 0, j;
- + unsigned int i, j;
-
- handle = (struct dyn_elf *) vhandle;
- if (handle == _dl_symbol_tables)
- @@ -491,13 +502,21 @@
- for (j = 0; j < handle->init_fini.nlist; ++j) {
- tpnt = handle->init_fini.init_fini[j];
- if (--tpnt->usage_count == 0) {
- - if (tpnt->dynamic_info[DT_FINI] && need_fini &&
- + if ((tpnt->dynamic_info[DT_FINI]
- + || tpnt->dynamic_info[DT_FINI_ARRAY])
- + && need_fini &&
- !(tpnt->init_flag & FINI_FUNCS_CALLED)) {
- tpnt->init_flag |= FINI_FUNCS_CALLED;
- - dl_elf_fini = (int (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]);
- - _dl_if_debug_print("running dtors for library %s at '%p'\n",
- - tpnt->libname, dl_elf_fini);
- - (*dl_elf_fini) ();
- +#ifdef SHARED
- + _dl_run_fini_array(tpnt);
- +#endif
- +
- + if (tpnt->dynamic_info[DT_FINI]) {
- + dl_elf_fini = (int (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]);
- + _dl_if_debug_print("running dtors for library %s at '%p'\n",
- + tpnt->libname, dl_elf_fini);
- + (*dl_elf_fini) ();
- + }
- }
-
- _dl_if_debug_print("unmapping: %s\n", tpnt->libname);
- @@ -541,8 +560,9 @@
- for (rpnt1 = _dl_symbol_tables; rpnt1->next; rpnt1 = rpnt1->next) {
- if (rpnt1->next->dyn == tpnt) {
- _dl_if_debug_print("removing symbol_tables: %s\n", tpnt->libname);
- + rpnt1_tmp = rpnt1->next->next;
- free(rpnt1->next);
- - rpnt1->next = rpnt1->next->next;
- + rpnt1->next = rpnt1_tmp;
- if (rpnt1->next)
- rpnt1->next->prev = rpnt1;
- break;
- @@ -588,8 +608,9 @@
- }
-
- /*
- - * Dump information to stderrr about the current loaded modules
- + * Dump information to stderr about the current loaded modules
- */
- +#if 1
- static char *type[] = { "Lib", "Exe", "Int", "Mod" };
-
- int dlinfo(void)
- @@ -660,16 +681,14 @@
- {
- char *strtab;
- ElfW(Sym) *symtab;
- - int hn, si;
- - int sf;
- - int sn = 0;
- + unsigned int hn, si, sn, sf;
- ElfW(Addr) sa;
-
- sa = 0;
- symtab = (ElfW(Sym) *) (pelf->dynamic_info[DT_SYMTAB]);
- strtab = (char *) (pelf->dynamic_info[DT_STRTAB]);
-
- - sf = 0;
- + sf = sn = 0;
- for (hn = 0; hn < pelf->nbucket; hn++) {
- for (si = pelf->elf_buckets[hn]; si; si = pelf->chains[si]) {
- ElfW(Addr) symbol_addr;
- @@ -696,3 +715,4 @@
- return 1;
- }
- }
- +#endif
- diff -urN uClibc-0.9.28.orig/libc/sysdeps/linux/i386/bits/syscalls.h uClibc-0.9.28/libc/sysdeps/linux/i386/bits/syscalls.h
- --- uClibc-0.9.28.orig/libc/sysdeps/linux/i386/bits/syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/libc/sysdeps/linux/i386/bits/syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -4,17 +4,15 @@
- # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
- #endif
-
- +#include <errno.h>
- +
- /* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel
- * header files. It also defines the traditional `SYS_<name>' macros for older
- * programs. */
- #include <bits/sysnum.h>
-
- -#ifndef __set_errno
- -# define __set_errno(val) (*__errno_location ()) = (val)
- -#endif
- -
- /*
- - Some of the sneaky macros in the code were taken from
- + Some of the sneaky macros in the code were taken from
- glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h
- */
-
- @@ -22,7 +20,8 @@
-
- /* We need some help from the assembler to generate optimal code. We
- define some macros here which later will be used. */
- -asm (".L__X'%ebx = 1\n\t"
- +
- +__asm__ (".L__X'%ebx = 1\n\t"
- ".L__X'%ecx = 2\n\t"
- ".L__X'%edx = 2\n\t"
- ".L__X'%eax = 3\n\t"
- @@ -56,7 +55,6 @@
- ".endif\n\t"
- ".endm\n\t");
-
- -
- #undef _syscall0
- #define _syscall0(type,name) \
- type name(void) \
- @@ -90,7 +88,7 @@
- type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
- { \
- return (type) (INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4)); \
- -}
- +}
-
- #undef _syscall5
- #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
- @@ -100,10 +98,18 @@
- return (type) (INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5)); \
- }
-
- +#undef _syscall6
- +#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
- + type5,arg5,type6,arg6) \
- +type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6) \
- +{ \
- +return (type) (INLINE_SYSCALL(name, 6, arg1, arg2, arg3, arg4, arg5, arg6)); \
- +}
- +
- #define INLINE_SYSCALL(name, nr, args...) \
- ({ \
- unsigned int resultvar; \
- - asm volatile ( \
- + __asm__ __volatile__ ( \
- LOADARGS_##nr \
- "movl %1, %%eax\n\t" \
- "int $0x80\n\t" \
- @@ -125,6 +131,7 @@
- #define LOADARGS_3 LOADARGS_1
- #define LOADARGS_4 LOADARGS_1
- #define LOADARGS_5 LOADARGS_1
- +#define LOADARGS_6 LOADARGS_1 "push %%ebp ; movl %7, %%ebp\n\t"
-
- #define RESTOREARGS_0
- #define RESTOREARGS_1 \
- @@ -133,6 +140,7 @@
- #define RESTOREARGS_3 RESTOREARGS_1
- #define RESTOREARGS_4 RESTOREARGS_1
- #define RESTOREARGS_5 RESTOREARGS_1
- +#define RESTOREARGS_6 "pop %%ebp\n\t" RESTOREARGS_1
-
- #define ASMFMT_0()
- #define ASMFMT_1(arg1) \
- @@ -145,7 +153,8 @@
- , "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4)
- #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \
- , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)
- -
- +#define ASMFMT_6(arg1, arg2, arg3, arg4, arg5, arg6) \
- + , "a" (arg1), "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5), "m" (arg6)
-
- #endif /* __ASSEMBLER__ */
- #endif /* _BITS_SYSCALLS_H */
- diff -urN uClibc-0.9.28.orig/libc/sysdeps/linux/powerpc/bits/syscalls.h uClibc-0.9.28/libc/sysdeps/linux/powerpc/bits/syscalls.h
- --- uClibc-0.9.28.orig/libc/sysdeps/linux/powerpc/bits/syscalls.h 2006-05-02 10:47:27.000000000 -0600
- +++ uClibc-0.9.28/libc/sysdeps/linux/powerpc/bits/syscalls.h 2006-04-28 00:14:35.000000000 -0600
- @@ -5,67 +5,164 @@
- # error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
- #endif
-
- +#include <errno.h>
- +
- /* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel
- * header files. It also defines the traditional `SYS_<name>' macros for older
- * programs. */
- #include <bits/sysnum.h>
-
- -
- -#define __STRINGIFY(s) __STRINGIFY2 (s)
- -#define __STRINGIFY2(s) #s
- -
- -#undef JUMPTARGET
- -#ifdef __PIC__
- -#define __MAKE_SYSCALL __STRINGIFY(__uClibc_syscall@plt)
- +/* Define a macro which expands inline into the wrapper code for a system
- + call. This use is for internal calls that do not need to handle errors
- + normally. It will never touch errno.
- + On powerpc a system call basically clobbers the same registers like a
- + function call, with the exception of LR (which is needed for the
- + "sc; bnslr+" sequence) and CR (where only CR0.SO is clobbered to signal
- + an error return status). */
- +
- +# undef INLINE_SYSCALL
- +#if 1
- +# define INLINE_SYSCALL(name, nr, args...) \
- + ({ \
- + INTERNAL_SYSCALL_DECL (sc_err); \
- + long int sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, args); \
- + if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err)) \
- + { \
- + __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err)); \
- + sc_ret = -1L; \
- + } \
- + sc_ret; \
- + })
- #else
- -#define __MAKE_SYSCALL __STRINGIFY(__uClibc_syscall)
- +# define INLINE_SYSCALL(name, nr, args...) \
- + ({ \
- + INTERNAL_SYSCALL_DECL (sc_err); \
- + long int sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, args); \
- + if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err)) \
- + { \
- + sc_ret = __syscall_error(INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err));\
- + } \
- + sc_ret; \
- + })
- #endif
-
- -#define unified_syscall_body(name) \
- - __asm__ ( \
- - ".section \".text\"\n\t" \
- - ".align 2\n\t" \
- - ".globl " __STRINGIFY(name) "\n\t" \
- - ".type " __STRINGIFY(name) ",@function\n\t" \
- - #name":\tli 0," __STRINGIFY(__NR_##name) "\n\t" \
- - "b " __MAKE_SYSCALL "\n\t" \
- - ".size\t" __STRINGIFY(name) ",.""-" __STRINGIFY(name) "\n" \
- - )
- +/* Define a macro which expands inline into the wrapper code for a system
- + call. This use is for internal calls that do not need to handle errors
- + normally. It will never touch errno.
- + On powerpc a system call basically clobbers the same registers like a
- + function call, with the exception of LR (which is needed for the
- + "sc; bnslr+" sequence) and CR (where only CR0.SO is clobbered to signal
- + an error return status). */
- +
- +# undef INTERNAL_SYSCALL_DECL
- +# define INTERNAL_SYSCALL_DECL(err) long int err
- +
- +# undef INTERNAL_SYSCALL
- +# define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
- + ({ \
- + register long int r0 __asm__ ("r0"); \
- + register long int r3 __asm__ ("r3"); \
- + register long int r4 __asm__ ("r4"); \
- + register long int r5 __asm__ ("r5"); \
- + register long int r6 __asm__ ("r6"); \
- + register long int r7 __asm__ ("r7"); \
- + register long int r8 __asm__ ("r8"); \
- + register long int r9 __asm__ ("r9"); \
- + register long int r10 __asm__ ("r10"); \
- + register long int r11 __asm__ ("r11"); \
- + register long int r12 __asm__ ("r12"); \
- + LOADARGS_##nr(name, args); \
- + __asm__ __volatile__ \
- + ("sc \n\t" \
- + "mfcr %0" \
- + : "=&r" (r0), \
- + "=&r" (r3), "=&r" (r4), "=&r" (r5), "=&r" (r6), "=&r" (r7), \
- + "=&r" (r8), "=&r" (r9), "=&r" (r10), "=&r" (r11), "=&r" (r12) \
- + : ASM_INPUT_##nr \
- + : "cr0", "ctr", "memory"); \
- + err = r0; \
- + (int) r3; \
- + })
- +# define INTERNAL_SYSCALL(name, err, nr, args...) \
- + INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
- +
- +# undef INTERNAL_SYSCALL_ERROR_P
- +# define INTERNAL_SYSCALL_ERROR_P(val, err) \
- + ((void) (val), __builtin_expect ((err) & (1 << 28), 0))
- +
- +# undef INTERNAL_SYSCALL_ERRNO
- +# define INTERNAL_SYSCALL_ERRNO(val, err) (val)
- +
- +# define LOADARGS_0(name, dummy) \
- + r0 = (long int)name
- +# define LOADARGS_1(name, __arg1) \
- + LOADARGS_0(name, 0); \
- + r3 = (long int)__arg1
- +# define LOADARGS_2(name, __arg1, __arg2) \
- + LOADARGS_1(name, __arg1); \
- + r4 = (long int)__arg2
- +# define LOADARGS_3(name, __arg1, __arg2, __arg3) \
- + LOADARGS_2(name, __arg1, __arg2); \
- + r5 = (long int)__arg3
- +# define LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4) \
- + LOADARGS_3(name, __arg1, __arg2, __arg3); \
- + r6 = (long int)__arg4
- +# define LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5) \
- + LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4); \
- + r7 = (long int)__arg5
- +# define LOADARGS_6(name, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6) \
- + LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5); \
- + r8 = (long int)__arg6
- +
- +# define ASM_INPUT_0 "0" (r0)
- +# define ASM_INPUT_1 ASM_INPUT_0, "1" (r3)
- +# define ASM_INPUT_2 ASM_INPUT_1, "2" (r4)
- +# define ASM_INPUT_3 ASM_INPUT_2, "3" (r5)
- +# define ASM_INPUT_4 ASM_INPUT_3, "4" (r6)
- +# define ASM_INPUT_5 ASM_INPUT_4, "5" (r7)
- +# define ASM_INPUT_6 ASM_INPUT_5, "6" (r8)
-
- #undef _syscall0
- -#define _syscall0(type,name) \
- -type name(void); \
- -unified_syscall_body(name)
- +#define _syscall0(type,name) \
- +type name(void){ \
- + return (type) INLINE_SYSCALL(name, 0); \
- +}
-
- #undef _syscall1
- #define _syscall1(type,name,type1,arg1) \
- -type name(type1 arg1); \
- -unified_syscall_body(name)
- +type name(type1 arg1){ \
- + return (type) INLINE_SYSCALL(name, 1, arg1); \
- +}
-
- #undef _syscall2
- #define _syscall2(type,name,type1,arg1,type2,arg2) \
- -type name(type1 arg1, type2 arg2); \
- -unified_syscall_body(name)
- +type name(type1 arg1, type2 arg2){ \
- + return (type) INLINE_SYSCALL(name, 2, arg1, arg2); \
- +}
-
- #undef _syscall3
- #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
- -type name(type1 arg1, type2 arg2, type3 arg3); \
- -unified_syscall_body(name)
- +type name(type1 arg1, type2 arg2, type3 arg3){ \
- + return (type) INLINE_SYSCALL(name, 3, arg1, arg2, arg3); \
- +}
-
- #undef _syscall4
- #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
- -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4); \
- -unified_syscall_body(name)
- +type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4){ \
- + return (type) INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4); \
- +}
-
- #undef _syscall5
- #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
- -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5); \
- -unified_syscall_body(name)
- +type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5){ \
- + return (type) INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5); \
- +}
-
- #undef _syscall6
- #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \
- -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6); \
- -unified_syscall_body(name)
- +type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6){ \
- + return (type) INLINE_SYSCALL(name, 6, arg1, arg2, arg3, arg4, arg5, arg6); \
- +}
-
- #endif /* _BITS_SYSCALLS_H */
-
|