Extrakce z archivu (statické knihovny)

Logik

  • *****
  • 1 030
    • Zobrazit profil
    • E-mail
Extrakce z archivu (statické knihovny)
« kdy: 12. 04. 2013, 18:42:58 »
Ahoj,
mam problém - mám statickou knihovnu (konkrétně metis), a potřebuji tuto knihovnu sloučit s jinou.
Šel jsem na to klasickou cestou - vyextrahovat obj soubory a:
ar x libmetis.a
ar x druháknivona
a vytvořit novou knihovnu:
ar rc novaknihovna *.o

Jenže v libmetis.a jsou dva soubory utils.c.o (každý s jiným obsahem). Při extrakci tak druhý přepíše první
a tak je výsledná knihovna nekompletní.

Takže otázka: nevíte jak buďto
a) sloučit dvě statické knihovny, aniž by se z nich musely extrahovat obj soubory
nebo
b) jak vyextrahovat z archivu všechny obj soubory, i když tam jsou dva se stejným jménem
a jiným obsahem
nebo
c) nějaké jiné řešení tédle situace? :-)



Logik

  • *****
  • 1 030
    • Zobrazit profil
    • E-mail
Re:Extrakce z archivu (statické knihovny)
« Odpověď #1 kdy: 13. 04. 2013, 15:58:57 »
Nikdo nic? :-) To sem to napsal tak nepochopitelně, nebo je to fakt neřešitelný?

monitor

Re:Extrakce z archivu (statické knihovny)
« Odpověď #2 kdy: 14. 04. 2013, 21:20:08 »
No, riesenie by mohlo byt:
1. vyextrahuj tie *.o subory z prveho *.a,
2. premenuj ten utils.o na utils1.o, alebo hocijake ine meno (napr. utils.libmetis.o)
3. vyextrahuj tie *.o subory z druheho *.a,
4. vytvor novy archive a tresni do neho vsetky tie *.o

...

ako sa hovori,

5. PROFITuj z toho :-)

Pri linkovani (ak je obsah tych utils.o a utils.o naozaj rozny, a nebiju sa)
by nemal byt dolezity nazov *.o suborov (vnutri tvojich *.a), ale ich obsah


monitor

Re:Extrakce z archivu (statické knihovny)
« Odpověď #3 kdy: 14. 04. 2013, 21:35:13 »
Aha, a este odpoved na Tvoju otazku: "a) sloučit dvě statické knihovny, aniž by se z nich musely extrahovat obj soubory
nebo"

1.
ak rozumies Makefile-om, tak napriklad, ak tie dva archivy sa robia v jednom Makefile-i,
tak mozes si urobit novy target, kde vytvoris ten treti archiv z tych *.o suborov, z ktorych sa vytvorili tie predchadzajuce dva *.a

2.
Inak, davam do pozornosti "option" pre ar s pismenkom T : (skus pouzit  pre ten novy, treti archive)

" Make the specified archive a thin archive.  If it already exists and is a regular archive, the existing members must be present in the same directory as
           archive.
"

"       GNU ar can optionally create a thin archive, which contains a symbol index and references to the original copies of the member files of the archives.  Such
       an archive is useful for building libraries for use within a local build, where the relocatable objects are expected to remain available, and copying the
       contents of each object would only waste time and space.  Thin archives are also flattened, so that adding one or more archives to a thin archive will add
       the elements of the nested archive individually.  The paths to the elements of the archive are stored relative to the archive itself.
"

Logik

  • *****
  • 1 030
    • Zobrazit profil
    • E-mail
Re:Extrakce z archivu (statické knihovny)
« Odpověď #4 kdy: 15. 04. 2013, 12:56:31 »
Jenže on je problém, že ten soubor utils.o je dvakrát v JEDNÉ knihovně. Takže já ten první vůbec neumím vyextrahovat, protože na příkaz
ar x libmetis.a utils.o
(nebo jak to je přesně, píšu z hlavy) se vždy vyextrahuje pouze ten druhý utils.o

Šahat do makefilů, kde se dělat ty původní soubory můžu, ale vzhledem k tomu, že to jsou third party knihovny a já stavim něco nad tim, tak to nechci. Už proto, že ty cizí knihovny pravděpodobně nemůžu distribuovat atd....

Zatím, co jsem vymyslel, je udělat z těch dvou statickejch knihoven sdílenou knihovnu, ale to taky není ideální řešení...


monitor

Re:Extrakce z archivu (statické knihovny)
« Odpověď #5 kdy: 15. 04. 2013, 22:52:16 »
Ospravedlnujem sa za nepozorne citanie...

navrhujem teda skusit toto:

1. rozbalit libmetis.a
ar x libmetis.a

1.5 pre istotu zmazat utils.c.o
rm utils.c.o

2. explicitne rozbalit PRVY vyskyt utils.c.o
ar xN 1 libmetis.a  utils.c.o

3. a hned aj premenovat utils.c.o na utils.c.1.o
mv utils.c.o utils.c.1.o

4. explicitne rozbalit DRUHY vyskyt utils.c.o
ar xN 2 libmetis.a  utils.c.o

5. skusit tie dalsie planovane kroky, akokeby sa nechumelilo (dnes teda u nas nie :-)
ar x druháknihovna.a
a vytvořit novou knihovnu:
ar rc novaknihovna *.o


Zdroj: man ar
"       N   Uses the count parameter.  This is used if there are multiple entries in the archive with the same name.  Extract or delete instance count of the given
           name from the archive."

(ak to nahodou nepojde, ako vyzera vystup:
ar tv libmetis.a

a co vidno pre tie subory utils.c.o
nm -s libmetis.a?)

Vela stastia (s particiami grafov?)