Alinhando matrizes estáticos no .bss seção de vinculador arquivo
-
21-09-2019 - |
Pergunta
Eu tenho uma função:
void testfunction() {
static char_t theChar1 = 1;
static unsigned char smallArray[1];
static unsigned char largeArray[135];
...
}
e um linker arquivo:
. = ALIGN(4);
_edata = . ;
PROVIDE (edata = .);
.bss (NOLOAD) :
{
__bss_start = . ;
__bss_start__ = . ;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
} > ramEXT
. = ALIGN(4);
__bss_end__ = . ;
PROVIDE (__bss_end = .);
Eu preciso de matrizes estáticos (.bss dados) para alinhar em 4 de limites de byte, mas parece matrizes recusar-se a fazê-lo.Estruturas e tipos primitivos alinhar multa (veja as linhas de preenchimento), mas as matrizes são de todo.Aqui está o meu arquivo de mapa:
.data.firstTimeFlag.7295
0xa000098c 0x4 output/file1.o
.data.theChar1.5869
0xa0000990 0x1 output/file2.o
*fill* 0xa0000991 0x3 00
.data.debounce
0xa0000994 0x270 output/file3.o
...
.bss.initialized.5826
0xa000812c 0x1 output/file2.o
*fill* 0xa000812d 0x3 00
.bss.allocator.5825
0xa0008130 0x34 output/file2.o
.bss.largeArray.5869
0xa0008164 0x87 output/file2.o
.bss.smallArray.5868
0xa00081eb 0x1 output/file2.o
.bss.initialized.5897
0xa00081ec 0x1 output/file2.o
*fill* 0xa00081ed 0x3 00
.bss.allocator.5896
Alguém sabe como alinhar matrizes?
Solução
Não tenho certeza se você pode fazer isso com um script de ligação e estou intrigado com seu objetivo; O atributo de alinhamento anexado a cada declaração do assembler presumivelmente atende aos requisitos da ABI e da máquina. Você está tentando aumentar a taxa de acerto do cache? Compensar o tipo não conforme punido no código-fonte?
Uma coisa que você pode "fazer facilmente" é adicionar a extensão de alinhamento GNU à fonte C.
static unsigned char smallArray[1] __attribute__ ((aligned (4)));
Atualizar: Hmm, uma grande biblioteca de macro de terceiros que gera um código obviamente não conforme? (Se fosse o código de conformidade padrão, presumivelmente funcionaria bem. :-) Ok, este é um kludge assustador, mas eu quase posso garantir que ele "funcionará", FSDO "trabalho" e não requer depuração da macro lib .. .Você poderia pós-processo da saída da linguagem de montagem do compilador. Os símbolos BSS estáticos locais não são sensíveis ao layout e geralmente são declarados em um único .comm
ou .lcomm
Diretiva, para a qual o último parâmetro provavelmente será o valor do alinhamento.
Este parâmetro é o que __attribute__
mudanças. Você pode mudar todos eles durante a construção com um script de algum tipo ...
Outras dicas
Em sistemas em que trabalhei, o vinculador parâmetros podem ser controlados para definir o alinhamento do início de cada seção, mas não o alinhamento das variáveis individuais dentro da seção.O alinhamento das variáveis individuais foi determinado pelo compilador, de acordo com o tipo da variável.
Você pode ser capaz de usar algum tipo de compilador pragma, específicos da plataforma do curso.
Uma alternativa é definir a matriz como uma matriz de qualquer tipo que você precisa alinhadas, tal como, uint32_t.
Estou curioso para saber o que você está tentando alcançar--soa como se você estiver fazendo algo um pouco incomum e específicos da plataforma, se você tem essa exigência de alinhamento.Melhor para criar uma plataforma de código independente, se possível, é claro.