Problemi con il linker

di il
7 risposte

Problemi con il linker

[ASSEMBLY] Problema con NASM e linker

Salve, sto tendando di iniziare a programmare in assembly, ma ho un problema: non riesco a linkare i programmi rendendoli eseguibili; ho Windows 8 come sistema operativo, ho installato NASM con path MyUser\Appdata\Local\nasm, e qui ho creato file "p.asm", il cui codice dovrebbe essere corrento, avendolo copiato da ; ho compilato, seguendo questa guida (cioé ho digitato "nasm -f win32 -l p.obj prova.asm") e apparentemente non ci sono problemi; successivamente ho installato, usando l'installer tool, minGw a C:\MinGw e, sempre seguendo la stessa guida, settato la variabile d'ambiente Path; ho poi provato a digitare dalla linea di comando di cmd "gcc p.obj -o p.exe" e questo è quanto ho ottenuto:
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:p.
format not recognized; treating as linker script
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:p.
ntax error
collect2.exe: error: ld returned 1 exit status
Qualcuno saprebbe dirmi cosa ho sbagliato (o, eventualmente, suggerirmi un altro linker)?
P.S.: Ho aperto questa discussione su un altro sito quattro giorni fa, ma non ho ottenuto risposta: spero non sia cross posting (nel caso fra quanto potrei riaprire la discussione?)

7 Risposte

  • Re: Problemi con il linker

    Ti consiglio di scaricare dosbox
    sotto ti posto il link per scaricartelo.
    http://www.windows8downloads.com/win8-dosbox-auifqjbh
    dopo aver scaricato il programma e aver montato i drive ricompila ed esegui il programma.
    per montare il drive devi lanciare il programma
    mount c: c:\directory del compilatore
    spero di esserti stato di aiuto.
  • Re: Problemi con il linker

    Grazie, fra l'altro mi sono accorto di avere cercato di linkare un file diverso da quello che avevo compilato... Comunque mi compare ancor aun errore (che forse dipende da MinGw, almeno a giudicare da questa discussione ):
    c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../
    o): In function `main':
    e:\p\giaw\src\pkg\mingwrt-4.0.3-1-mingw32-src\bld/
    /src/libcrt/crt/main.c:91: undefined reference to
    collect2.exe: error: ld returned 1 exit status
    Ho anche provato con un altro linker (GoLinker) che linkava il programma, ma una volta che ho provato ad eseguirlo Windows ha aperto una finestra che affermava che il programma aveva smesso di funzionare. Adesso sto provando con "nasm -f obj p2.asm" e "gcc p2.obj -o p2.exe" ma, il linker mi dà questo errore:
    p2.obj: file not recognized: File format not recog
    collect2.exe: error: ld returned 1 exit status.
    Grazie comunque per l'aiuto.
  • Re: Problemi con il linker

    Il gcc non va molto bene perchè e impostato sul sistema operativo linux
    un consiglio
    sotto windows se ti interessa programmare in assembler 16 bit
    vai su questo sito troverai un buon ambiente di sviluppo e numerosi consigli sul come programmare:
    http://www.giobe2000.it
    se invece ti interessa la programmazione assembler 32-64 bit il modo migliore e visual studio.
    spero di esserti stato di aiuto
  • Re: Problemi con il linker

    @smalldragon .... Ma perché dovrebbe programmare con vecchissimi ambienti (16 bit) quando sta compilando un codice per Win32 sun Win8 ?

    @Caradhras ... I link che hai indicato non sono validi ... per vedere il sorgente, inseriscilo nuovamente. Poi, hai ottenuto il file p.obj ?
  • Re: Problemi con il linker

    @oregon pensavo che fosse per studio e poi anche in ambienti 32 bit usando delle opzioni si può programmare in 16 bit. di solito si tendono a scaricare ambienti a 32-64 bit perchè uno pensa che possano servire anche per il futuro. il che ha una sua logica.
  • Re: Problemi con il linker

    Anche se per studio, non ha senso studiare per i 16 bit addirittura in modalità reale (DOS). E' veramente obsoleto.
  • Re: Problemi con il linker

    smalldragon ha scritto:


    il gcc non va molto bene perchè e impostato sul sistema operativo linux
    un consiglio
    sotto windows se ti interessa programmare in assembler 16 bit
    vai su questo sito troverai un buon ambiente di sviluppo e numerosi consigli sul come programmare:
    http://www.giobe2000.it
    se invece ti interessa la programmazione assembler 32-64 bit il modo migliore e visual studio.
    spero di esserti stato di aiuto
    La mia intenzione era in effetti quella di iniziare con il 16bit perché preferirei non usare, almeno all'inizio, le API; in una fase successiva passare al 32bit (anche se, se trovo il 16bit troppo difficile, potrei passare al 32bit), per cui mi servirebbero tutti e due; comunque adesso ho installato l'ambiente di lavoro e, grazie all'uso di DOS box, sono riuscito a linkare ed eseguire un programma a 16 bit.

    oregon ha scritto:


    @smalldragon .... Ma perché dovrebbe programmare con vecchissimi ambienti (16 bit) quando sta compilando un codice per Win32 sun Win8 ?

    @Caradhras ... I link che hai indicato non sono validi ... per vedere il sorgente, inseriscilo nuovamente. Poi, hai ottenuto il file p.obj ?
    Stavo usando un codice a 32 bit in primo luogo perché, nel caso non riuscissi con il 16bit, anche 32bit andrebbe bene, e in secondo luogo perché volevo prendere un file che fossi certo andasse bene con NASM (il sito che ho linkato usa NASM) per evitare che errori di compilazione fossero dovuti a miei errori nel listato del programma. Ero riuscito a creare il file p.obj, il problema era nel linker. Posto comunque il codice per completezza (anche se per ora dovrei avere risolto):
    section	.text
        global _start   ;must be declared for linker (ld)
    _start:	            ;tells linker entry point
        mov	edx,len     ;message length
        mov	ecx,msg     ;message to write
        mov	ebx,1       ;file descriptor (stdout)
        mov	eax,4       ;system call number (sys_write)
        int	0x80        ;call kernel
    	
        mov	eax,1       ;system call number (sys_exit)
        int	0x80        ;call kernel
    
    section	.data
    msg db 'Hello, world!', 0xa  ;our dear string
    len equ $ - msg     ;length of our dear string

    Queste invece le istruzioni per settare la variabile PATH:
    • Dopo l'installazione del MinGW, per un suo corretto utilizzo bisogna
    settare alcune variabili d'ambiente,
    • Risorse del computer->(tasto destro del mouse)Proprietà->Avanzate-
    >Variabili D'ambiente
    • andare nel riquadro variabili di sistema selezionare, dalla lista, la
    variabile path e cliccare su Modifica, scrivere nel campo valore
    della variabile "path" la stringa ";c:\mingw\bin“
    • Cliccare quindi su Nuovo ed inserire in "nome variabile" la stringa
    MINGDIR ed in "valore variabile" la stringa "c:\mingw".
    • Cliccare quindi su Ok.
    Grazie a tutti per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
7 risposte