Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Le Jabra Evolve3 85 non sono semplicemente cuffie Bluetooth con cancellazione del rumore. Sono un dispositivo professionale pensato per chi trascorre gran parte della giornata in riunione, al telefono o davanti a un assistente basato sull'intelligenza artificiale
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-01-2012, 22:12   #1
fano
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:
  1. la dlopen(NULL,...) è nella stessa libreria statica in una funzione con attributo "constructor" che cioè gira appena la libreria è linkata
  2. Uso la serie di macro "uthash"
  3. 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...ù

Codice:
main.c

main()
{
 while (1) {
    handle_event(); // questa è l'unica funzione chiamata DAVVERO della lib
 }
}
... e per quanto riguarda la libreria:

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: 

   }
}
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 ?
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?
fano è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2012, 00:30   #2
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2012, 09:42   #3
fano
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:
  1. La libreria è dinamica (.so) non statica (.a)
  2. E` il main() che fa dlopen()/ dlsym()/dlclose(), non la stessa libreria nel suo "costruttore"
  3. La dlopen() non è con NULL, ma con il nome della libreria
  4. I nostri Makefile sono tutti carucci per stampare [CC] e nascondere la compilazione... poi non ci capisce più nulla... a me -rdynamic pare di non averlo visto, però!

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.
fano è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2012, 14:52   #4
fano
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
fano è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Il CEO di NVIDIA Jensen Huang ammette la...
Moon Base: la NASA amplia contratti e mi...
L'italiana Avio fa un passo indietro sul...
SpaceX Starship: Flight 15 punta al prim...
Smartbox colpita da un attacco hacker: e...
Un'IA risolve in 3 giorni un enigma che ...
TOP 10 Amazon weekend: tornano gli Smart...
ReactOS introduce il supporto USB 3.0: i...
TECLAST M60 a soli 159€ su Amazon: table...
Haier da 65 pollici a partire da 397€ su...
Google Pixel 11, Pro e Pro XL in offerta...
Memorie, inversione di tendenza: i PC co...
Rubati 6 pallet di hardware NVIDIA da 11...
Addio ai limiti del silicio? Ecco il dia...
Windows 11 27H2 sarà un 'cambio completo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:40.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v