Domanda

Ho un binario "CeeloPartyServer" che ha bisogno di trovare libFoundation.so in fase di esecuzione, su una macchina FreeBSD. Sono entrambi nella stessa directory. Compilo (su un'altra piattaforma, utilizzando un cross compiler) CeeloPartyServer utilizzando bandiera linker "-rpath = $ ORIGIN".

> readelf -d CeeloPartyServer |grep -i rpath
 0x0000000f (RPATH)                      Library rpath: [$ORIGIN]
> ls
CeeloPartyServer    Contents        Foundation.framework    libFoundation.so
> ./CeeloPartyServer 
/libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer"

Perché non è vero trovando la libreria quando provo a farlo funzionare? La mia linea esatto linker è: -lm -lmysql -rpath = $ ORIGIN. Io sono abbastanza sicuro che non devo fuggire \ $ o qualcosa di simile dal momento che la mia analisi readelf in effetti mostrano che rpath biblioteca è impostato su $ ORIGIN. Che cosa mi manca?

È stato utile?

Soluzione

Sto assumendo che si sta utilizzando gcc e binutils.

Se fai

readelf -d CeeloPartyServer | grep ORIGIN

Si dovrebbe tornare alla linea RPATH hai trovato sopra, ma si dovrebbe anche vedere alcune voci circa le bandiere. Quanto segue è da una libreria che ho costruito.

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS)              ORIGIN
0x000000006ffffffb (FLAGS_1)            Flags: ORIGIN

Se non si è visto una sorta di iscrizioni FLAGS, probabilmente non hanno detto il linker per contrassegnare l'oggetto come richiedono un trattamento di origine. Con binutils ld, si esegue questa operazione passando la bandiera -z origin.

sto cercando di indovinare che si sta utilizzando gcc per guidare il collegamento, però, quindi in questo caso sarà necessario passare attraverso il compilatore bandiera con l'aggiunta di -Wl,-z,origin alla vostra linea di collegamento gcc.

Altri suggerimenti

A seconda di quanti strati di questo flag passa attraverso prima il linker lo vede, potrebbe essere necessario l'uso $$ORIGIN o addirittura \$$ORIGIN. Saprete che avete ragione quando readelf mostra un'intestazione RPATH che assomiglia $ORIGIN/../lib o simili. Il $ in più e il backslash sono solo per evitare che il $ da in fase di elaborazione da parte di altri strumenti della catena.

\ $ \ ORIGIN se si utilizza chrpath e \ $ \ $ ORIGIN se si sta fornendo direttamente in LDFLAGS

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top