fano
23-01-2012, 22:12
Salve a tutti ho grossi, grossissimi problemi con gcc al quale piace cancellare le funzione che, lui, uno stupido software crede siano non usate :mad:
Allora cerco di spiegarmi, meglio, ma sarà difficile... la cosa è oggettivamente complicata :p
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:
la dlopen(NULL,...) è nella stessa libreria statica in una funzione con attributo "constructor" che cioè gira appena la libreria è linkata
Uso la serie di macro "uthash"
Le funzioni, di cui si parla, ovviamente, sono definite, ma mai chiamate direttamente...
Ecco cona accade facendo un esempio in "meta-codice"... notate che il main() fa ben poco il 99% del codice dovrà ESSERE nella libreria...ù
main.c
main()
{
while (1) {
handle_event(); // questa è l'unica funzione chiamata DAVVERO della lib
}
}
... e per quanto riguarda la libreria:
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:
}
}
A gcc, infatti, piace cancellare il 90% del codice di sta povera libreriia dicendo che nessuno lo usa... certo come no... e allora cosa ci sta a fare :doh: ?
L'ho scritto così per passa-tempo :ciapet: ?
Si vede, ahimè, chiaramente con nm... nel .a ci sono ste funzioni, ma non nel binario :mad: :mad: :mad:
Dovrebbe esserci un flag del linker -rdynmic, ma noin fa nulla... debbo fare una libreria dinamica... suppongo :confused:
Ho trovato anche tra gli attributi del gcc "used" che dovrebbe fare ciò che richiedo, ma non lo fa... lo cancella ugualmente :doh:
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 :doh:
Cosa mi dite? Son io che son rinco o non si puote?
Allora cerco di spiegarmi, meglio, ma sarà difficile... la cosa è oggettivamente complicata :p
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:
la dlopen(NULL,...) è nella stessa libreria statica in una funzione con attributo "constructor" che cioè gira appena la libreria è linkata
Uso la serie di macro "uthash"
Le funzioni, di cui si parla, ovviamente, sono definite, ma mai chiamate direttamente...
Ecco cona accade facendo un esempio in "meta-codice"... notate che il main() fa ben poco il 99% del codice dovrà ESSERE nella libreria...ù
main.c
main()
{
while (1) {
handle_event(); // questa è l'unica funzione chiamata DAVVERO della lib
}
}
... e per quanto riguarda la libreria:
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:
}
}
A gcc, infatti, piace cancellare il 90% del codice di sta povera libreriia dicendo che nessuno lo usa... certo come no... e allora cosa ci sta a fare :doh: ?
L'ho scritto così per passa-tempo :ciapet: ?
Si vede, ahimè, chiaramente con nm... nel .a ci sono ste funzioni, ma non nel binario :mad: :mad: :mad:
Dovrebbe esserci un flag del linker -rdynmic, ma noin fa nulla... debbo fare una libreria dinamica... suppongo :confused:
Ho trovato anche tra gli attributi del gcc "used" che dovrebbe fare ciò che richiedo, ma non lo fa... lo cancella ugualmente :doh:
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 :doh:
Cosa mi dite? Son io che son rinco o non si puote?