|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
dlsym su funzione NON usata (seocndo gcc, almeno)
Salve a tutti ho grossi, grossissimi problemi con gcc al quale piace cancellare le funzione che, lui, uno stupido software crede siano non usate
Allora cerco di spiegarmi, meglio, ma sarà difficile... la cosa è oggettivamente complicata Io ho un main che linka una libreria staticamente e gli piace chiamare alcune funzioni di questa libreria nel solito modo tipico del C... in alcuni momenti però in base a, diciamo, eventi da parte di un utente alcune funzioni devono essere eseguite... ma ho una stringa in quel momento, non una "funzione" vsito che di fatto o lo leggo da file o lo genero per "default"... di fatto son delle callback, OK? Nulla di esotico... Le differenze rispetto al solito sono, direi:
Ecco cona accade facendo un esempio in "meta-codice"... notate che il main() fa ben poco il 99% del codice dovrà ESSERE nella libreria...ù Codice:
main.c
main()
{
while (1) {
handle_event(); // questa è l'unica funzione chiamata DAVVERO della lib
}
}
Codice:
events.c
init_lib __attribute((constructor)) {
dlerror(); // cancello errori precedenti, come da man
dlopen(NULL);
if dlerror() // non valorizzato, indi va, no?
[...] // utash, etc...
}
handle_event() {
// molto codice: json, utash... YADDA.. YADDA
// abbiate pietòà ORA il function pointer non lo so scirvere... è come da man anch'esso...
dlerror(); // cancello errori precedenti, come da man
(int)(funt*)()fucntptr = dlsym("func"); // funct è una funzione definita qui, ma MAI usata! ... APPUNTO!
if dlerror() // == "no symbol found :cry: :cry: :cry:
}
}
?L'ho scritto così per passa-tempo ?Si vede, ahimè, chiaramente con nm... nel .a ci sono ste funzioni, ma non nel binario Dovrebbe esserci un flag del linker -rdynmic, ma noin fa nulla... debbo fare una libreria dinamica... suppongo Ho trovato anche tra gli attributi del gcc "used" che dovrebbe fare ciò che richiedo, ma non lo fa... lo cancella ugualmente Ricordo di averlo fatto un apio di volte... usdando pure NULL (che vi ricordo vuol dire cerca dentro te STESSO)... pensavo che linkare staticamente volesse dire, di fatto, dal punto di vista del programma che era codice "suo" non faceva differenza, per intendersi, se lo avessi scritto DENTRO al main(), no? Bah... al limite posso fare un .so, ma in sto caso non ne vedo molto il senso... è bello modificarla a runtime, ma in sto caso mi sa che non serve a una mazza Cosa mi dite? Son io che son rinco o non si puote? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Indipendentemente dalla causa,
Non puoi ispezionare a priori la DLL e compilare nel tuo main tutte le chiamate possibili, anche se di fatto le chiamate non verranno mai raggiunte? Tipo: main() { while (1) { handle_event(); // questa è l'unica funzione chiamata DAVVERO della lib } return; // Inutile, ma while(1) gia' non si puo' vedere... func(); } Puoi fare anche tutto da preprocessore. Il precompilatore ispeziona la DLL e genera un file con tutte queste chiamate, che verra' poi compilato insieme al resto, e che dovrebbe quindi forzare il compilatore a linkare veramente tutti i metodi.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
OK, posto di riuscire a farlo ciò che dici... mi pare un po` complicatino...
Ma, poi, non dovrebbe funzionare come ho fatto? dlopen() a cosa serve altrimenti? Io SO che va, l'ho già usato, ma in modo leggermente differente:
Quindi? Mi converrebbe usare una libreria dinamica, forse? ... o c'è un modo per sopprimere questa, per me, ora, fastidiosa & controproducente feature di GCC? Io di quella libreria ESIGO OGNI SIMBOLO sia esportato, GCC non deve discutere Ultima modifica di fano : 24-01-2012 alle 09:45. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Allora, per correttezza, in modo che Google possa trovare la soluzione la posto:
Sembrerebbe che abbiamo un problema di compilazione; infatti noi usiamo gcc sia per compilare CHE (trappola) per linkare! ... sì signori se VOLETE finire nei guai NON usate ld, ma gcc per linkare! Non so se ld risolve... eh perchè con ld il linking non va,... ho usato troppe evil gcc extensions In ogni caso, ho risolto con il metodo canonico... libreria dinamica tranquillamente nella sua direttori e linkata da "ldd" alla partenza dell'applicazione... in questo modo dl_open(NULL) va e visto che i simboli sono ora, tutti presenti (gcc NON me li vede e NON li cancella ) e, di fatto, a quel punto parte dell'eseguibile... quindi anche dlsym() va, mi restituisce il *func... e io posso chiamare la mia funzione alla faccia di gcc e delle sue ottimizzazioni del pirillo L'unico problema è che dovete mantenere lib e applicazione compatibile: ovvero MAI togliete paramentri alla funzione da castare per dlsym() ----> SEGFAULT |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:53.










?
?
) e, di fatto, a quel punto parte dell'eseguibile... quindi anche dlsym() va, mi restituisce il *func... e io posso chiamare la mia funzione alla faccia di gcc e delle sue ottimizzazioni del pirillo







