O arquivo system.map
Parece haver escassez de informações sobre o arquivo System.map. Ele não é nada misterioso, e não é mesmo tão importante assim. Mas a falta de documentação torna-o sombrio. É como um lóbulo da orelha, que todos nós temos um, mas ninguém sabe por quê.
O que são símbolos?
No contexto da programação, um símbolo é o alicerce de um programa: é um nome de variável ou um nome de função.
O que é a tabela de símbolos do Kernel?
O Kernel não usa nomes para símbolos como BytesRead(). É muito mais fácil conhecer o nome da variável ou função, através do endereço como c0343f20. Os seres humanos, por outro lado, não apreciam endereços como c0343f20. Nós preferimos usar nomes de símbolos como BytesRead(). Normalmente, isso não representa um grande problema. O Kernel é principalmente escrito em C, assim o compilador/linkeditor nos permite usar nomes de símbolo quando estamos codificando e permite o Kernel usar endereços quando ele é executado. Todo mundo fica feliz.
Há situações, porém, que precisamos saber o endereço de um símbolo (ou o símbolo de um endereço). Isso é feito por uma tabela de símbolos, e é muito similar a como gdb pode dar-lhe o nome da função de um endereço (ou um endereço de um nome de função). A tabela de símbolos é uma listagem de todos os símbolos, juntamente com seu endereço. Aqui está um exemplo de uma tabela de símbolos:
c03441a0 B dmi_broken
c03441a4 B is_sony_vaio_laptop
c03441c0 b dmi_ident
c0344200 b pci_bios_present
c0344204 b pirq_table
c0344208 b pirq_router
c034420c b pirq_router_dev
c0344220 b ascii_buffer
c0344224 b ascii_buf_bytes
Você pode ver que a variável chamada dmi_broken está no endereço Kernel c03441a0.
O que é o arquivo system.map?
Há dois arquivos que são usados como tabelas de símbolos do Kernel:
1. /proc/kallsyms
2. System.map
Agora você já sabe o que é o arquivo System.map.
Cada vez que você compila um novo Kernel, é necessário mudar os endereços dos nomes de vários símbolos.
Leia o restante deste post »