código C cómo utilizar las variables definidas en el guión enlazador?

Artículo de referencia:

https://sourceware.org/ml/binutils/2007-07/msg00154.html

Autor: Wei Dongshan, 03/01/2017 escritura para pedir un centenar de foros

Fuente original:

http://bbs.100ask.org/forum.php?mod=viewthread&tid=16231

En los guiones de enlace, a menudo tiene este código:

SECTIONS
{
.....
. = ALIGN(4);
.rodata : { *(.rodata) }

. = ALIGN(4);
.data : { *(.data) }

. = ALIGN(4);
.got : { *(.got) }

. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}

En donde __bss_start, _END segmento BSS representa el inicio, la dirección final.

Cuando queremos borrar este espacio,
1. En __bss_start conjunto de código puede ser directamente referencia, _END, tales como:

ldr r0, =__bss_start
ldr r1, =_end

2. En el código C, no se puede utilizar directamente, haga lo siguiente:

void clean_bss(void)
{
extern int __bss_start, _end;
int *p = &__bss_start;
   
for (; p < &_end; p++)
        *p = 0;
}

Usted puede preguntarse: __ bss_start, _END no representa un valor que? En el código C ¿Por qué utilizar el símbolo de dirección y?

Razones:
En primer lugar, en el código C, una sentencia como:

int foo = 1000;

Dará lugar a dos cosas sucederá:

  1. En el código, dejando 4 bytes de espacio, para salvar los valores de 1000
  2. En symbole talbe lenguaje C, es decir, la tabla de símbolos, hay una llamada foo artículos en su interior había un espacio de direcciones de 4 bytes.

Ejecutamos foo = 1, irá a buscar la dirección de la correspondiente tabla de símbolos foo, y luego rellenar el valor 1 corresponde a la dirección de la memoria;

Cuando se ejecuta un int * = & foo, dirigirá la dirección de foo tabla de símbolos, escribió una.

En segundo lugar, en el guión de enlazado, se supone

__bss_start = 1000

__bss_start no es una variable, es sólo un valor, no es necesario dejar un espacio en la memoria para salvarlo;

En el lenguaje C, habrá una entrada de la tabla de símbolos llamado __bss_start, este valor del proyecto (valor de dirección) es de 1000;

Tenga en cuenta que esta memoria de 1000 no existe realmente.

III.
Por lo tanto: En el lenguaje C, ir al enlace utilizando los valores definidos en la secuencia de comandos, usted debe hacer esto:

extern int __bss_start;
int val = &__bss_start;

Utilice el valor de dirección conseguirlo y notación en la tabla de símbolos.
Tenga en cuenta que este valor es valor definido en el script sólo vinculado, no significa que la dirección de una variable.



1, aprender más incrustados productos secos por favor, preste atención a las micro-canal número público [centenar de preguntas de Ciencia y Tecnología]
2, discusiones técnicas Por favor, añadir carta micro personal: 13266630429
3. Wei Dongshan se enfrenta a viejos agentes de captación de estudiantes y distribuidores, comisión del 20%, están interesadas las personas de contacto por favor carta de micro.

Publicados 135 artículos originales · ganado elogios 401 · vistas 260 000 +

Supongo que te gusta

Origin blog.csdn.net/thisway_diy/article/details/101016296
Recomendado
Clasificación