Pregunta

Tengo algunos archivos NASM que tienen una línea:

%INCLUDE "bmdev.asm"

los bmdev.asm El archivo tiene directivas EQU tales como:

b_print_newline         equ 0x0000000000100040

Los archivos que incluyen bmdev.asm entonces pueden llamar a esos elementos. Es decir

call b_print_newline

¿Hay alguna forma de convertir esto a gas? Cuando trato de hacer la traducción directa, es decir

.set b_print_newline , 0x100040

call b_print_string

No parece desmontar lo correcto:

callq  *0x100040

La llamada NASM se desmonta a:

callq  0xfffffffffff00040

El objetivo aquí es generar binarios para OS de Baremetal a través de gas en lugar de nasm.

El desmontaje completo del binario que funciona:

$ objdump -D -b binary -m i386:x86-64 test-nl.app 

test-nl.app:     file format binary


Disassembly of section .data:

0000000000000000 <.data>:
   0:   e8 3b 00 f0 ff          callq  0xfffffffffff00040
   5:   c3                      retq   

El desmontaje completo del binario que no funciona:

$ objdump -D -b binary -m i386:x86-64 test-nl-a.app 

test-nl-a.app:     file format binary


Disassembly of section .data:

0000000000000000 <.data>:
   0:   ff 14 25 40 00 10 00    callq  *0x100040
   7:   c3                      retq   

He publicado una versión (con suerte) más clara de esta pregunta. Cerrando este.

¿Fue útil?

Solución 2

Mencioné este problema en la lista de correo binutils. Parece ser un error. Se sugirió que presentara un informe de errores y Lo he hecho.

A arreglar ha sido registrado en el árbol binutils.

Otros consejos

Parece un poco extraño que sea tan difícil obtener una llamada relativa, tal vez alguien más inteligente puede saltar.

De todos modos, haciendo:

.set b_print_newline, 0x100040
call b_print_newline

Resulta en (como usted notó) como generar un salto indirecto.

Puedes fingirlo por tu cuenta usando el . (punto) pseudo-variable:

call b_print_newline - .

O puede usar el enlazador (línea de comando o script como desee) para definir símbolos con los nombres correctos, en cuyo caso el código se compila como desee.

$ cat test.S
.section .text
.globl _start
_start:
    call b_print_newline
    ret
$ as --64 -o test.o test.S
$ ld --defsym b_print_newline=0x100040 -Ttext 200000 --oformat binary -o test.bin test.o
$ objdump -D -b binary -m i386:x86-64 test.bin
test.bin:     file format binary

Disassembly of section .data:

0000000000000000 <.data>:
   0:   e8 3b 00 f0 ff          callq  0xfffffffffff00040
   5:   c3                      retq   

Probablemente haya una manera de hacer que funcione sin usar el enlazador para definir símbolos, pero no he podido encontrar una manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top