es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué debe un programa y todos sus sistemas estáticamente definidos construidos con la Cadena de Herramientas RISC-V ajustarse a un rango de direcciones de 2 GB?

Estoy tratando de crear un ejecutable RISC-V ELF de 64 bits utilizando la cadena de herramientas RISC-V con newlib y un script de enlace que coloca la sección de texto en 0x100 y la sección de datos comenzando en 0x100000000 (mayor que el límite de 2 GB). Sin embargo, obtengo el siguiente error:

Se truncó la reubicación para ajustarse: R_RISCV_HI20 contra el símbolo `__global_pointer$' definido en la sección .sdata en a.out
collect2: error: ld devolvió el estado de salida 1

Noté que las opciones de RISC-V especifican estas dos opciones –mcmodel:
“`
-mcmodel=medlow
Genera código para el modelo de código medio-bajo. El programa y sus símbolos definidos estáticamente deben estar dentro de un solo rango de dirección de 2 GiB y deben estar entre las direcciones absolutas -2 GiB y +2 GiB. Los programas pueden estar enlazados estática o dinámicamente. Este es el modelo de código predeterminado.

-mcmodel=medany
Genera código para el modelo de código medio-cualquiera. El programa y sus símbolos definidos estáticamente deben estar dentro de cualquier rango de dirección de 2 GiB. Los programas pueden estar enlazados estática o dinámicamente.
“`

Sin embargo, me confunde por qué, incluso con registros de 64 bits, no puedo utilizar todo el espacio de dirección de 64 bits dentro de mi ejecutable. Cualquier aclaración sería muy apreciada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error que estás enfrentando se debe a que una reubicación es demasiado grande para caber dentro del modelo de código especificado. La cadena de herramientas RISC-V permite dos modelos de código: medlow y medany.

    El modelo medlow restringe el programa y sus símbolos definidos estáticamente a un solo rango de direcciones de 2 GiB entre las direcciones absolutas de -2 GiB y +2 GiB. Por otro lado, el modelo medany permite que el programa y sus símbolos definidos estáticamente estén dentro de cualquier rango de direcciones de 2 GiB.

    Dado tu script de enlazador que coloca la sección de datos comenzando en 0x100000000, lo cual se encuentra más allá del límite de 2 GiB de medlow, es posible que desees considerar usar el modelo de código medany en su lugar. Esto debería permitirte utilizar todo el espacio de direcciones de 64 bits dentro de tu ejecutable.

    También vale la pena señalar que el uso del símbolo de puntero global “__global_pointer$” puede estar causando que la reubicación sea demasiado grande. Puedes asegurarte de que tu programa no dependa de este símbolo o intentar usar un símbolo diferente para ver si se resuelve el problema.

    Espero que esto aclare el problema que estás enfrentando.

Comments are closed.