Problem z linkerem (MinGW)

0

Witam.
Ostatnio bawiłem się asemblerem i do momentu kompilowania kodu i linkowaniu go szło wszystko dobrze. Problem pojawił się gdy chciałem program odpalić i... "test.exe nie odpowiada". Taka sytuacja pojawia się zawsze, gdy linkuje program bezpośrednio za pomocą ld.exe, ale gdy kompiluje przez gcc od razu do pliku .exe to problemu nie ma. Z dokumentacji się dużo nie dowiedziałem.

Używam zestawu MinGW na Win7
Komenda, której użyłem: ld test.o -o test.exe

Z góry dzięki

0

moze problem z kodem. Masz moze gdzies UB. Moze nie linkujesz odpowiednich plikow.
Za malo informacji

0

Kod w C wygląda tak:

#include <stdio.h>

int main(){
printf("Napis");
return 0;
}

Kompiluje to poleceniem:
gcc main.c -o test.o
A potem linkuję:
ld test.o -o test.exe

I wyjściowy test.exe po odpaleniu crashuje. Pewnie to problem w podanych komendach.
PS: Co to UB?

0

Zakładam, że gcc linkuje coś więcej, a ty po prostu tego nie podajesz i dlatego się wywala. Podaj opcję -v do linkowania via gcc. Wtedy powinieneś zobaczyć dokładną komendę linkera, którą wykonuje gcc.

Tak na oko to zakładałbym, że w ogóle ci się ten sampel nie zlinkuje via ręczne wywołanie ld (poleci undefined reference), bo w ogóle nie linkujesz libc.

Btw, UB to undefined behaviour w nomenklaturze standardów C/C++. Tutaj to jest zupełnie niepowiązane.

0
Wiesiekdx napisał(a):

Witam.
Ostatnio bawiłem się asemblerem

Kod w C wygląda tak:

#include <stdio.h>

int main(){
printf("Napis");
return 0;
}

I gdzie ten asembler?

Taka sytuacja pojawia się zawsze, gdy linkuje program bezpośrednio za pomocą ld.exe, ale gdy kompiluje przez gcc od razu do pliku .exe to problemu nie ma.

Możesz również linkować za pomocą gcc.

gcc plik.o -o plik.exe

Różnica jest taka, że gcc wie jakie prawidłowe podać parametry do ld, i dodaje bibliotekę standardową C.

0

Jak kompilowałeś assemblerem to dałeś parametr formatu ?
Bez tego ld nie zadziała.

Dla nasm masz

nasm -f win64 plik.asm

Mając format, ld łatwo załaduje libc jak będzie potrzebne.

Jak nie dasz formatu to otrzymasz czysty plik binarny, przydaje się to jak potrzebujesz shellcode, ale tak to trzeba kompilować z formatem.

0
Azarien napisał(a):
Wiesiekdx napisał(a):

Witam.
Ostatnio bawiłem się asemblerem

Kod w C wygląda tak:

#include <stdio.h>

int main(){
printf("Napis");
return 0;
}

I gdzie ten asembler?

Taka sytuacja pojawia się zawsze, gdy linkuje program bezpośrednio za pomocą ld.exe, ale gdy kompiluje przez gcc od razu do pliku .exe to problemu nie ma.

Możesz również linkować za pomocą gcc.

gcc plik.o -o plik.exe

Różnica jest taka, że gcc wie jakie prawidłowe podać parametry do ld, i dodaje bibliotekę standardową C.

Przepraszam za niewytłumaczenie. Problem zaczął się, gdy pisałem w assembly. Dla przykładu podałem tylko prosty kod w C.
Jeżeli chodzi o assembly to problem rozwiązany. Linkuje program z DLLkami które mi trzeba, i działa.
Problem jest dalej z C. Użyłem opcji -v w gcc i okazało się że linkuje jednak dużo bibliotek. Czy trzeba w ld trzeba linkować wszystkie biblioteki? Czy są jakieś biblioteki, które w każdym programie muszą być?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.