[c++] Static Linking - Portable Binary

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BartBlackMagic
  • Registratie: December 2003
  • Laatst online: 10-09 08:55
We hebben een Synology NAS met DSM 4.0, dit is een op linux 2.6.32 gebaseerde x86 64 bit distro met een webinterface om alles te beheren. Ook krijg 'k toegang via SSH. Via deze webinterface kan je een directory service draaien (OpenLDAP) maar deze heeft een module die wij nodig hebben (syncprov) niet meegecompileerd. De bedoeling is om zelf OpenLDAP te compileren. Er staat geen gcc of dergelijke op deze distro maar er is wel een toolchain beschikbaar (met gcc 4.2) met de nodige basis libraries om vanalles te compileren.
1e probeersel:
OpenLDAP compileren met deze toolchain op ons host systeem (Kubuntu 64 bit). Probleem: compileren lukt niet omdat libnss, libdb niet beschikbaar zijn in de meegeleverde libraries.

2e probeersel:
OpenLDAP compileren zonder de toolchain (dus gewoon op het host systeem) maar met static linking. Maw aan de configure gewoon een parameter meegeven: ./configure --disable-shared (optie wordt herkend). Resultaat:
Bash:
1
2
3
4
5
6
7
8
9
10
ldd servers/slapd/slapd
        linux-vdso.so.1 =>  (0x00007fff63dff000)
        libdb-5.1.so => /usr/lib/x86_64-linux-gnu/libdb-5.1.so (0x00007faf7fc27000)
        libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007faf7f9cb000)
        libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007faf7f602000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007faf7f3e5000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faf7f028000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007faf7ee23000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007faf7ec0c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007faf7ffbb000)

Omdat deze optie niet expliciet in ./configure --help werd meegegeven, heb 'k --enable-static=libdb-5.1 eens geprobeerd maar dit zorgde niet voor een ander resultaat:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
ldd servers/slapd/slapd
        linux-vdso.so.1 =>  (0x00007fff1cdff000)
        libldap_r-2.4.so.2 => /home/bart/Downloads/openldap-2.4.32/libraries/libldap_r/.libs/libldap_r-2.4.so.2 (0x00007f4291129000)
        liblber-2.4.so.2 => /home/bart/Downloads/openldap-2.4.32/libraries/liblber/.libs/liblber-2.4.so.2 (0x00007f4290f19000)
        libdb-5.1.so => /usr/lib/x86_64-linux-gnu/libdb-5.1.so (0x00007f4290b87000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f429096a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f42905ac000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f4290390000)
        libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f4290134000)
        libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f428fd6b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f4291379000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f428fb67000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f428f94f000)


3e probeersel:
expliciet compiler options meegeven:
env CPPFLAGS="-I/usr/include/nss" \ CFLAGS="-static -static-libgcc" ./configure
Verandert niets aan de zaak, opties worden niet meegenomen in de verschillende makefiles.
Uiteindelijk heb 'k dan de makefiles manueel veranderd; aan de CFLAGS -static en -static-libgcc toegevoegd maar uiteindelijk zei LDD mij nog steeds dat de slapd binary verschillende libraries dynamisch gelinked had.

Vraag 1
Ik weet dat static linked binaries niet de beste oplossing zijn maar het leek mij wel de eenvoudigste oplossing om niet met een DLL-hell (SO-hell) te zitten. Is er alsnog een makkelijke optie om een static linked binary te creeëren die zonder mokken draait op mijn NAS?

Vraag 2
De juiste oplossing zal wrs zijn om alle benodigde libraries zoals libssl, libdb-5.1 te compileren met de toolchain en aan de toolchain libraries toe te voegen. Vraag is hoe ik dat doe en hoe 'k dan uiteindelijk alles naar mijn NAS geïnstalleerd kan krijgen (op een werkbare manier). Er staat namelijk geen scp op (wel samba).

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Is er alsnog een makkelijke optie om een static linked binary te creeëren die zonder mokken draait op mijn NAS?
Hangt van de libs af. Je schrijft dat het om libnss en libdb gaat. Mogelijk kun je bij het compileren opgeven of je hem static of shared gecompileerd wilt hebben. (Iets als ./configure --enable-static) Als je de static library meelinkt is je probleem weg.
Vraag is hoe ik dat doe en hoe 'k dan uiteindelijk alles naar mijn NAS geïnstalleerd kan krijgen (op een werkbare manier). Er staat namelijk geen scp op (wel samba).
Je kunt je files in een tar via samba overzetten, en lokaal uitpakken.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:53
Ik snap niets van je probleem. Je zegt dat je niet kunt compileren omdat je libraries mist (zonder een foutmelding te posten — foei!) en vervolgens kun je wel statisch compileren maar worden die libraries alsnog dynamisch gelinkt :?
BartBlackMagic schreef op zondag 12 augustus 2012 @ 14:20:
Vraag 1
Ik weet dat static linked binaries niet de beste oplossing zijn maar het leek mij wel de eenvoudigste oplossing om niet met een DLL-hell (SO-hell) te zitten. Is er alsnog een makkelijke optie om een static linked binary te creeëren die zonder mokken draait op mijn NAS?
De makkelijkste optie is om gewoon de benodigde libraries uit een Debian package ofzo te halen en die op je NAS te pleuren.

Volgens het Internet kun je ook ipkg als package manager gebruiken op die NAS maar ik weet niet of je de gewenste libraries als ipkg packages kunt vinden.
Vraag 2
De juiste oplossing zal wrs zijn om alle benodigde libraries zoals libssl, libdb-5.1 te compileren met de toolchain en aan de toolchain libraries toe te voegen. Vraag is hoe ik dat doe en hoe 'k dan uiteindelijk alles naar mijn NAS geïnstalleerd kan krijgen (op een werkbare manier). Er staat namelijk geen scp op (wel samba).
Hoe heb je dat getest? Je hoeft op de NAS geen scp client te hebben om wel scp support te hebben in de server. (Er is trouwens ook nog sftp.)

En je kunt altijd nog bestanden kopiëren via ssh alleen; bijvoorbeeld:
find somedir/ | cpio -o | ssh user@host cpio -i

... maar ik vermoed dat dat niet nodig is.

[ Voor 5% gewijzigd door Soultaker op 12-08-2012 17:15 ]


Acties:
  • 0 Henk 'm!

  • BartBlackMagic
  • Registratie: December 2003
  • Laatst online: 10-09 08:55
Even wat extra uitleg bij het compileren met die toolchain op mijn Kubuntu-systeem. Het volgende codeblock moet je gebruiken (volgens de Synology developer guide) om iets te compileren voor hun nas met de toolchain die je kan downloaden:
Bash:
1
2
3
4
5
6
7
8
9
10
# env CC=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-gcc \
LD=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-ld \
RANLIB=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-ranlib \
CFLAGS="-I/usr/local/i686-linux-gnu/include" \
LDFLAGS="-L/usr/local/i686-linux-gnu/lib" \
./configure \
--host=i686-linux-gnu \
--target=i686-linux-gnu \
--build=i686-pc-linux \
--prefix=/usr/local

en daar zitten de libs zoals libdb-5.1 en libnss (en anderen) niet in dus geeft hij vanzelfsprekend errors bij het runnen van configure. Daarom heb 'k dat gelaten voor wat het is en ben 'k OpenLDAP gaan compileren zonder deze toolchain te gebruiken maar gewoon met alle libraries op mijn host systeem zelf. (libdb5.1-dev, libnss-dev, ...)

@Mijzelf: dus ik moet libdb en libnss en dergelijke ook eerst als static compileren eer ik ze op kan geven als static libraries bij het compileren van OpenLDAP? Bedoel je dat? Het script .configure --help in de openldap directory geeft mij deze enigste optie die iets te maken heeft met static: --enable-static=PKGS. Dus ik denk dat 'k deze juist heb gebruikt.

@Soultaker: Zo zit het idd. De optie "--enable-static" bij configure is niet genoeg om de libraries statisch te linken. Als 'k 't goed heb zeg je dus dat 'k alle libraries die 'slapd' nodig heeft zoals door 'ldd' opgegeven op men host system (64 bit kubuntu) kan kopiëren naar men NAS en het dan moet werken? Dat ga 'k morgen gelijk proberen! Thx trouwens voor dat commando gpio, kende 'k nog niet. Ik heb geprobeerd te scp-en naar men nas maar dit was niet ondersteund.

EDIT: Oja! De error die slapd gaf op mijn nas was: cannot find library libdb-5.1, wat nogal logisch is aangezien ldd zegt dat deze dynamisch gelinkt is en 'k dacht dat deze statisch mee gelinkt was...

[ Voor 5% gewijzigd door BartBlackMagic op 12-08-2012 22:47 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 03-10 20:26

Creepy

Tactical Espionage Splatterer

Even een tikje door naar NOS waar ik denk dat ze er iets meer mee kunnen. PRG -> NOS

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:53
@Creepy: ik zou niet denken dat sysadmins noodzakelijkerwijs meer ervaring hebben met crosscompilation dan programmeurs hoor, maar wie weet. :P
BartBlackMagic schreef op zondag 12 augustus 2012 @ 22:44:
Even wat extra uitleg bij het compileren met die toolchain op mijn Kubuntu-systeem. Het volgende codeblock moet je gebruiken (volgens de Synology developer guide) om iets te compileren voor hun nas met de toolchain die je kan downloaden:
Bash:
1
2
3
4
5
6
7
8
9
10
# env CC=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-gcc \
LD=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-ld \
RANLIB=/usr/local/i686-linux-gnu/bin/i686-linux-gnu-ranlib \
CFLAGS="-I/usr/local/i686-linux-gnu/include" \
LDFLAGS="-L/usr/local/i686-linux-gnu/lib" \
./configure \
--host=i686-linux-gnu \
--target=i686-linux-gnu \
--build=i686-pc-linux \
--prefix=/usr/local
Maar hier configure je expliciet voor een i686 architectuur, terwijl je in je TS stelt dat de NAS een x86_64 distro draait (hetzelfde als je desktop, dus). Kun je voor de zekerheid eens de uitvoer van uname -a op je NAS posten?
en daar zitten de libs zoals libdb-5.1 en libnss (en anderen) niet in dus geeft hij vanzelfsprekend errors bij het runnen van configure.
Aha, dat kan kloppen. Je hebt dan de 64-bit versies van die libraries misschien wel geïnstalleerd, maar niet de 32-bits versies die je gebruikt voor cross-compilation. Die zou je dan inderdaad eerst zelf moeten compileren. Of je de dynamische of statische versie gebruikt maakt eigenlijk weinig uit, maar dynamische libraries zijn gebruikelijker.
Daarom heb 'k dat gelaten voor wat het is en ben 'k OpenLDAP gaan compileren zonder deze toolchain te gebruiken maar gewoon met alle libraries op mijn host systeem zelf. (libdb5.1-dev, libnss-dev, ...)
Dat kan, maar dan krijg je dus een x86_64 library. Wat je misschien ook moet hebben. Maar dan kun je net zo goed de Debian/Ubuntu packages zelf gebruiken.
Als 'k 't goed heb zeg je dus dat 'k alle libraries die 'slapd' nodig heeft zoals door 'ldd' opgegeven op men host system (64 bit kubuntu) kan kopiëren naar men NAS en het dan moet werken?
Hangt er een beetje vanaf — het kan zijn dat je binaries niet compatible zijn met libc op de NAS (en die kun je maar beter niet vervangen!) maar het is een poging waard.

Acties:
  • 0 Henk 'm!

  • BartBlackMagic
  • Registratie: December 2003
  • Laatst online: 10-09 08:55
Ik heb wel degelijk de x86_64 toolchain gedownload, maar met snel te zijn de verkeerde gekopieerd hier.
Resultaat van uname -a
code:
1
Linux storagestation 2.6.32.12 #2198 SMP Wed Mar 7 15:40:49 CST 2012 x86_64 GNU/Linux synology_bromolow_3612xs


Momenteel heb 'k eens geprobeerd alle libraries (buiten libc) te kopiëren naar men NAS, het resultaat is het volgende:
Bash:
1
2
3
4
5
6
7
storagestation> ./slapd
./slapd: /lib64/libc.so.6: version `GLIBC_2.4' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.7' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.12' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.4' not found (required by /lib64/libdb-5.1.so)
...

Daarna heb 'k LD_LIBRARY_PATH laten verwijzen naar een directory met libpthread.so.0 en libc.so.6 (de versies van mijn Kubuntu systeem) en dan is dit het resultaat:
Bash:
1
2
storagestation> ./slapd
Floating point exception (core dumped)

Kan ik hier nog iets aan doen of is de enigste manier om het werkende te krijgen: alle benodigde libraries compileren met de toolchain en vervolgens deze libs en slapd over te kopiëren naar de NAS?

Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
dus ik moet libdb en libnss en dergelijke ook eerst als static compileren eer ik ze op kan geven als static libraries bij het compileren van OpenLDAP?
Je moet ze in ieder geval compileren, aangezien ze op je target niet aanwezig zijn. Wanneer je ze static compileerd, bevat de -door OpenLDAP- meegelinkte lib alle code, en hoeft de .so file dus niet op de target gezet te worden. (Deze wordt waarschijnlijk dan ook niet aangemaakt)

Overigens zul je wel aan de configure van OpenLDAP moeten vertellen waar de includes en libs staan. Iets als
--with-libnss=/path/to/libnns

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:53
BartBlackMagic schreef op maandag 13 augustus 2012 @ 08:29:
Momenteel heb 'k eens geprobeerd alle libraries (buiten libc) te kopiëren naar men NAS, het resultaat is het volgende:
Bash:
1
2
3
4
5
6
7
storagestation> ./slapd
./slapd: /lib64/libc.so.6: version `GLIBC_2.4' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.7' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.12' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./slapd)
./slapd: /lib64/libc.so.6: version `GLIBC_2.4' not found (required by /lib64/libdb-5.1.so)
...
Aha, dit is dus de libc incompatibility waar ik bang voor was.
Daarna heb 'k LD_LIBRARY_PATH laten verwijzen naar een directory met libpthread.so.0 en libc.so.6 (de versies van mijn Kubuntu systeem) en dan is dit het resultaat:
Bash:
1
2
storagestation> ./slapd
Floating point exception (core dumped)
Een leuke poging maar in het algemeen werkt het gebruik van verschillende versies van libc op één systeem niet goed, zeker niet als de libc voor een andere kernel gecompileert is (in dit geval de kernel van je desktop OS).

Om dezelfde redenen lijkt statisch linken tegen libc me geen goede oplossing.
Kan ik hier nog iets aan doen of is de enigste manier om het werkende te krijgen: alle benodigde libraries compileren met de toolchain en vervolgens deze libs en slapd over te kopiëren naar de NAS?
Heeft je toolchain ook een aparte libc? Als je tegen de lokale versie linkt heb je uiteindelijk hetzelfde probleem.




Gebruik je een van deze toolchain packages trouwens? Zo ja, welke? (Cedarview?)

[ Voor 4% gewijzigd door Soultaker op 13-08-2012 14:57 ]


Acties:
  • 0 Henk 'm!

  • BartBlackMagic
  • Registratie: December 2003
  • Laatst online: 10-09 08:55
Ik gebruik deze toolchain:
gcc420_glibc236_x64_bromolow-GPL.tgz
De toolchain bevat alle tools (gcc, ld, ranlib, ..) en libraries (libc, libthread, ...) om een simpel programma te compileren, maar bevat nog geen libdb, libssl, libnss. Libnss zit er wel in, maar blijkbaar niet de juiste versie aangezien hij tijdens het builden nssutil.h niet kan vinden. Ik ga straks proberen de libs die openldap nodig heeft te compileren en dan zien of het een haalbare taak .

Een andere manier is om te cross-compilen met Emerge die gebruik maakt van deze toolchain maar zelf alle benodigde packages download en compileert.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:53
Ah ja. Waarom extract je die toolchain niet gewoon op je NAS? Dat voorkomt al direct problemen met verkeerde libraries die meegelinkt worden, en je kunt dan alles direct netjes in /usr/local installeren (--prefix=/usr/local).

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Waarom maak je het zo moeilijk...

1) Bootstrap je Synology:
http://forum.synology.com...rver,_bootstrap,_ipkg_etc
2a) installeer de nodige libs
ipkg install libdb
2b) compileer de nodige libs (libnss is op mijn Synology toestel (arm-based) niet beschikbaar - misschien bij jou wel?)
ipkg install make automake autoconf gcc (... en wat je nog denkt nodig te hebben)
./configure ... --prefix=/opt
make
make install
3) installeer slapd (zie 2b)

Als het echt niet anders kan, zul je moeten elke lib die je nodig hebt cross-compilen en installeren op je NAS. Maar zelfs al doe je dit, kan ik je nog aanraden om te bootstrappen, zodat je environment wat voorzien is om te werken met binaries/libs die niet op de standaard plaatsen staan.
Maar blijf vooral weg uit locaties als /usr! Gebruik /opt, deze wordt bij upgrades met rust gelaten.

[ Voor 28% gewijzigd door H!GHGuY op 13-08-2012 17:55 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • BartBlackMagic
  • Registratie: December 2003
  • Laatst online: 10-09 08:55
Ipkg installeren bleek niet zomaar te gaan door simpelweg de instructies te volgen, telkens als 'k een "reboot" wou doen (wat nodig is om de installatie te voltooien), bleef de NAS hangen en werkte ipkg alsnog niet. Blijkbaar is dit een bekend probleem.
Daarna ben 'k dus maar begonnen met elke library te cross compilen en manueel over te zetten. Uiteindelijk heb 'k zowel de originele 2.3.11 als de laatste 2.4.32 versie van OpenLDAP kunnen compileren (met enkele kleine aanpassingen aan een header file en de configure file) en alles werkt. Oh :F een stom dingetje dat 'k telkens was vergeten bij de configure was om de locatie van slapd.conf mee te geven, my bad.
Bedankt aan allen voor de goede raad!
Pagina: 1