Укажите путь incbin как предопределенный макрос в NASM и GCC. - PullRequest
1 голос
/ 25 мая 2019

Я хочу встроить двоичный файл в исполняемый файл, способный переноситься на Windows и Linux.

Для этого я хочу использовать файл сборки с директивой incbin.Например:

.intel_syntax noprefix


      .global _img0_start
      .global _img0_end
      .global _img0_size


_img0_start:   .incbin "img0.bin"
_img0_end:
_img0_size:    .quad  $ -  _img0_start

Я не могу знать, где будут находиться двоичные файлы до компиляции вышеуказанного файла сборки, поэтому я хочу заменить img0.bin макросом и определитьэто в аргументах командной строки, как если бы я использовал опцию gcc -D для определения макро константы.

Я видел, что существует -d Option: Pre-Define a Macro, который позволяет делать в точности то же самое, нотолько для числовых значений (мне нужно указать путь к файлу).(шрифт: https://www.nasm.us/doc/nasmdoc2.html#section-2.1.19)

Есть ли что-то вроде -d, но это позволяет определять строки и работает для moth gas и nasm?

Ответы [ 2 ]

2 голосов
/ 25 мая 2019

Я прочитал больше и понял, что нет необходимости в макросе, который расширяется до строки.

Вместо этого можно просто указать фиксированное имя для двоичного файла в моемcase, img0.bin, а затем используйте параметр -I для предоставления дополнительных путей для поиска такого файла.

Другими словами, с тем же файлом сборки, что и выше (пусть это будет assembly_file.s), простоделать:

gcc -c assembly_file.s -I<path_to_folder_that_contains_img0.bin> -o <output_file_name>

0 голосов
/ 25 мая 2019

Макросы NASM и препроцессор C допускают произвольные строки.

NASM equ константы должны быть целыми числами, но %define foo eax или nasm '-DIMG="foo.bin"' обе работают.

Обратите внимание, что определение макроса включает двойные кавычки. CPP позволяет легко развернуть макрос внутри двойных кавычек, но я не удосужился проверить, может ли NASM легко это сделать что.

Обычно легко создать строку в двойных кавычках, например, в Make или в любом другом месте.


;;; foo-nasm.asm  NASM source
incbin IMG
# foo-gas.S   GAS source (capital S gets GCC to run it through CPP)
.incbin IMG

hi.bin содержит B8 68 69 00 00, 32/64-битный машинный код для mov eax, 'hi'


 $ gcc -c foo-gas.S -DIMG='"hi.bin"'            
 $ nasm -felf64 foo-nasm.asm -DIMG='"hi.bin"'       

$ disas foo-gas.o
...
0000000000000000 <.text>:
   0:   b8 68 69 00 00          mov    eax,0x6968

$ disas foo-nasm.o
...
0000000000000000 <.text>:
   0:   b8 68 69 00 00          mov    eax,0x6968

...