Why program linked using gcc works but using ld isn't working?

0

i'm new to assembly language and I have a problem. Recently i wrote program which is simply just adding two numbers. Here is my problem: when I run and debug the program using SASM IDE (it uses gcc), or link it using gcc - program works fine, but when I try to link it using ld - when I run it, I get message "Segmentation fault (core dumped)". Here is my program (AT&T syntax, pls don't mind the comments - they're in polish):

.global main

.data

#zakładam że liczba1 jest dłuższa lub tak samo długa jak liczba2
#zakładam również że żadna z liczb nie jest mniejsza niż 4B
liczba1: 
        .long 0x10304008, 0x701100FF, 0x45100020, 0x08570030
liczba1_len = (.-liczba1)/4

    
liczba2: 
        .long 0xF040500C, 0x00220026, 0x321000CB, 0xFFFFFFFF
liczba2_len = (.-liczba2)/4

wynik:
        .space (liczba1_len+1)

.text
main:
    movl %esp, %ebp #for correct debugging
    movl $0, %ecx
    
    movl $liczba1, %ebx                     # adres liczba1 (dłuższa liczba) w ebx
    movl $wynik, %esi                       # adres wyniku w ebx
    clc
    pushf
loop_1:
    popf                                    # dla ułatwienia słowo = 32b część liczby (double-word)
    movl (%ebx, %ecx, 4), %eax              # kopiowanie słowa liczba1 do akumulatora
    adcl 4*liczba1_len(%ebx,%ecx,4), %eax   # dodawanie odpowiadającego słowa liczba2 do wcześniej skopiowanego z liczba1 
    movl %eax, (%esi, %ecx, 4)              # zapisanie wyniku
    inc %ecx
    pushf
    cmp $liczba2_len, %ecx                  # pętla loop_1 wykonuje tą część dodawania, w której dodajemy odpowiadające sobie słowa
    jb loop_1                               # z liczba1 i liczba2
    
    cmp $liczba1_len, %ecx                  # sprawdzany jest przypadek kiedy liczby mają tą samą długość
    je end                                  # w takim przypadku nie jest potrzebne dalsze odczytywanie liczb
                                            # pozostaje tylko ewentualna propagacja przeniesienia na ostatnią 
                                            # pozycję wyniku wykonywana za etykietą end:
loop_2:   
    popf
    movl (%ebx, %ecx, 4), %eax              # przenoszenie do eax dalszych słów liczba1 dla których nie ma już odpowiedników
                                            # w liczba 2 - zdarza się to kiedy liczba2 jest krótsza od liczba1
    adcl %eax, (%esi, %ecx, 4)              # przenoszenie wcześniej przenoszonych do eax słów do wyniku wraz z ewentualną
    inc %ecx                                # propagacją przeniesień
    pushf
    cmp $liczba1_len, %ecx
    jb loop_2

end:  
    popf 
    adcl $0, (%esi, %ecx, 4)                # ostatnia propagacja przeniesień - w przypadku kiedy po dodaniu najstarszych
                                            # słów liczb występuje przepełnienie
    
    

    ret

Here is makefile with options that I use. This doesn't work - i get message "Segmentation fault (core dumped)" when I try to run the program.

all: dodawanie

dodawanie: dodawanie.o
        ld -e main -o dodawanie -m elf_i386 dodawanie.o

dodawanie.o: dodawanie.asm
        as dodawanie.asm -o dodawanie.o --32

Here is how I link it using gcc ("as" options the same as above). This works.

gcc dodawanie.o -o dodawanie -m32 -no-pie
assembly
gcc
ld
asked on Stack Overflow May 10, 2021 by drozddawid

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0