каковы правильные флаги для смешивания сборки и C без потери констант .data - PullRequest
0 голосов
/ 06 августа 2020

Я работаю над утилитой на ассемблере (x86, NASM 2.13, g cc 7.50, Ubuntu 18.X), которая будет вызываться из C. Проблема, с которой я столкнулся, заключается в том, что адреса строковых констант, похоже, теряются в процессе создания, поэтому сообщения не печатаются. Я вижу строковые константы в окончательном двоичном файле.

Это пример кода ассемблера

SECTION .data
    error_len_message: db  "test", 10
    error_len_message_len: equ $-error_len_message
    
SECTION .text

    global test_func
    
    test_func:
        mov eax, 4
        mov ebx, 1
        mov ecx, error_len_message
        mov edx, error_len_message_len
        int 80H

Заголовочный файл был бы тривиальным, так как ему нужна была бы только подпись, используемая в main. c

#include    "....."

int main(void) {
    test_func();
    return 0;
}

make-файл исполняемого файла выглядит следующим образом:

util_tests: ../asm/utilities/utilities.o
    gcc -Wall -o ./build/$@ main.c  $?

../asm/utilities/utilities.o:
    cd ../asm/utilities && make && cd ../../util_tests;

clean:
    cd ../asm/utilities && make clean && cd ../../util_tests;

make-файл утилит выглядит следующим образом:

utilities.o: test/test.o
    ld $? -o $@
    
test/test.o:
    cd test && make && cd ..;

clean:
    cd test && make clean && cd ..;
    rm *.o

make файл тестового кода ассемблера:

test.o: test.asm
    nasm -f elf64 -g -F dwarf $?
clean:
    rm *.o

У меня нет проблем с превращением его в исполняемый файл, используя только ассемблер и выводя строки, определенные в разделе .data. Сделайте файл:

test: test.o
    ld -o test $^ 

test.o: *.asm
    nasm -f elf64 -g -F stabs $?
clean:
    rm *.o

Я могу успешно определять и использовать переменные в разделе .bss (для краткости не показано)

Я считаю, что проблема в том, как я создаю утилита. Заранее спасибо!

1 Ответ

0 голосов
/ 08 августа 2020

Итак, после добавления подходящего "rel по умолчанию" в исходный файл ассемблера, удаления прямых вызовов int 80H и добавления вызовов printf компоновщик терпит неудачу, потому что он также пытается переместить "printf@glibc_x.x.x". После попытки опций компоновщика игнорировать неразрешенные символы, это похоже на тупик. пусть звонящий сделает все остальное. Следующие команды Assembly, Link и GDB отображают правильно совпадающие метки и смещения

DEFAULT REL

SECTION .text    

    global silly    
    
    silly:
        lea r9, [message]
        ret
        
SECTION .data
    message: db  "A Message", 10

Makefile:

silly.so: silly.o
    ld -shared $? -o $@

silly.o: silly.asm
    nasm -f elf64 -g -F dwarf $?
    
clean:
    rm *.o
    rm *.so

Надеюсь, это будет полезно для всех

...