Di recente ho messo in campo una domanda di un cliente VOS che voleva sapere come far allineare le sue regioni di memoria virtuale condivisa tra i suoi programmi non-POSIX legacy e i suoi nuovi programmi basati su POSIX.
Questo cliente aveva utilizzato il comando create_data_object per creare diverse regioni di memoria virtuale condivisa. Aveva poi utilizzato un file di controllo bind per assicurarsi che ogni programma facesse riferimento alle regioni nello stesso ordine e allo stesso indirizzo virtuale. Il problema era che non importava come usava il comando gcc per legare i suoi nuovi programmi basati su POSIX, non riusciva ad allineare le regioni SVM. I nuovi programmi mettono le regioni SVM a diversi indirizzi. Anche l'uso di un bindfile con gcc non aiutava.
La mappa di rilegatura (o l'uscita del comando display_program_module) rivela che i programmi POSIX iniziano sempre con i moduli oggetto "s_start_c_program" e "crti". Il modulo oggetto s_start_c_program appare più tardi nel programma legacy e il modulo oggetto crti non appare affatto. La presenza di questi due moduli di oggetto spinge tutti i moduli di oggetto successivi verso il basso nel file, con conseguente disallineamento.
Non c'è modo di impedire a gcc di mettere questi due moduli oggetto al primo posto nel modulo di programma. Quindi, la soluzione è quella di cambiare il modo in cui i programmi di legacy sono vincolati. Poiché le regioni SVM devono iniziare su un confine di pagina, e poiché le dimensioni combinate delle regioni del codice s_start_c_program e crti sono meno di una pagina, tutto quello che dobbiamo fare è assegnare una pagina extra, non utilizzata, all'inizio dei programmi legacy . Utilizzare il comando create_data_object per creare un oggetto dati da 4096 byte e inserirlo nel file di controllo del binding come primo modulo oggetto.
Abbiamo concordato di mantenere la dimensione di questi due programmi a 1 pagina (4096) byte o meno, quindi questa soluzione funzionerà in futuro.
Se avete domande su questa tecnica, inviatele qui sotto.