2016-01-19 23 views
6

Ho un codice C++ 14 che dovrebbe caricare un file oggetto arbitrario condiviso con dlopen. Sfortunatamente su alcuni sistemi (ad esempio il mio archlinux, si dice che si applichi anche ad alcuni .so su ubuntu e gentoo), questi so-file possono essere "GNU ld scripts" invece dei binari reali.Caricamento di GNU ld script con dlopen

Per riferimento, ecco il contenuto del mio /usr/lib/libm.so:

/* GNU ld script 
*/ 
OUTPUT_FORMAT(elf64-x86-64) 
GROUP (/usr/lib/libm.so.6 AS_NEEDED (/usr/lib/libmvec.so.1)) 

ho trovato un paio di code-pezzi che si occupano di questo problema in ghc o ruby. Vorrei evitare di ricorrere all'analisi manuale del file di testo basato sull'analisi del testo dlerror e del file. Sento che è terribilmente malvagio e non sarò in grado di implementare e gestire casi angolari di questo formato.

Esiste un modo pulito per implementare la gestione di questo caso? Francamente sono perplesso sul motivo per cui dlopen in realtà non gestisce questi passaggi.

Nota: Considerando le patch summenzionate, penso che questo non sia semplicemente un problema con la configurazione/le versioni del mio sistema. Se questo dovrebbe funzionare immediatamente con dlopen (bug invece di funzionalità mancante), per favore fatemelo sapere.

+0

Il tuo ld.so è abbastanza recente? – marcolz

+0

Non correlato a una lingua specifica, ma al caricamento/collegamento. – Olaf

+0

@Olaf Sto cercando una soluzione che possa essere utilizzata nel mio programma C++. Dal momento che sto caricando la libreria durante il runtime usando il codice C++/C, la considero correlata. – Zulan

risposta

4

Gli script del linker devono essere utilizzati dal linker, non dal linker di runtime.

Il commento GNU ld script avrebbe dovuto essere un omaggio: questo è per ld, non per ld.so. ;-)

Si veda ad esempio: http://www.math.utah.edu/docs/info/ld_3.html

quindi credo che usando questo con dlopen() significherebbe imitando/importazione parte della magia ld s' per questo, che confermerebbe i vostri timori circa ricorrere alla analisi manualmente il testo e mantenendo un codice terribilmente malvagio.

EDIT: Sembra che ci sia una cosa che può aiutare a se:

https://www.sourceware.org/ml/libc-alpha/2011-07/msg00152.html

<gnu/lib-names.h> dovrebbe contenere una definiscono LIBM_SO cui si dovrebbe puntare al file corretto che si può effettivamente dlopen().

Ciò significa che normalmente non sarebbe necessario alcun codice malvagio.

+0

Anche se questo non era quello che speravo/cercando, la modifica è davvero utile. Anche se non gestisce il problema in modo trasparente e sposta la soluzione al codice del chiamante, è pulito e mi salva dagli orrori. – Zulan

Problemi correlati