Recentemente coloquei uma pergunta de um cliente VOS que queria saber como fazer com que suas regiões de memória virtual compartilhada se alinhassem entre seus programas antigos não-POSIX e seus novos programas baseados em POSIX.
Este cliente tinha usado o comando create_data_object para criar várias regiões diferentes de memória virtual compartilhada. Ele havia então utilizado um arquivo de controle de vinculação para garantir que cada programa referisse as regiões na mesma ordem e no mesmo endereço virtual. O problema era que não importava como ele usava o comando gcc para vincular seus novos programas baseados no POSIX, ele não conseguia fazer com que as regiões SVM se alinhassem. Os novos programas colocavam as regiões SVM em endereços diferentes. Mesmo usando um arquivo bindfile com o gcc não ajudou.
O mapa bind (ou a saída do comando display_program_module) revela que os programas POSIX sempre começam com os módulos de objetos "s_start_c_program" e "crti". O módulo de objeto s_start_c_program aparece mais tarde no programa antigo, e o módulo de objeto crti não aparece de forma alguma. A presença destes dois módulos de objeto empurra todos os módulos de objeto subseqüentes para baixo no arquivo, o que resulta no desalinhamento.
Não há como impedir que o gcc coloque estes dois módulos de objeto em primeiro lugar no módulo do programa. Portanto, a solução é mudar a maneira como os programas legados são vinculados. Como as regiões SVM devem começar em um limite de página, e como o tamanho combinado das regiões s_start_c_program e crti code são menores que uma página, tudo o que precisamos fazer é alocar uma página extra, não utilizada, no início dos programas legados. Use o comando create_data_object para criar um objeto de dados de 4096 bytes e colocá-lo no arquivo de controle bind como o primeiro módulo de objeto.
Concordamos em manter o tamanho destes dois programas em 1 página (4096) bytes ou menos, de modo que esta solução funcionará no futuro.
Se você tiver alguma dúvida sobre esta técnica, por favor, coloque-a abaixo.