ld: fatal: Symbol referencing errors. No output written to assembler

ld: fatal: Symbol referencing errors. No output written to assembler - C++ - Programmation

Marsh Posté le 13-05-2003 à 13:46:48    

a quoi est du le probleme?


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 13:46:48   

Reply

Marsh Posté le 13-05-2003 à 14:20:23    

ca me sort la liste des symboles posant probleme...
ce que je ne comprends pas c est que  
j ai 3 fonctions tres proches...
et qu il n y en a que deux qui font des erreurs...


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 14:22:50    

:heink:  
Attends, je cours chercher ma boule de cristal et je suis à toi...
Donne un peu de détails quand tu poses une question!
C'est un pb de link, donc il nous faudrait au moins le compilateur utilisé, ainsi que la syntaxe utilisée pour la compilation, par exemple!

Reply

Marsh Posté le 13-05-2003 à 14:25:11    

make MACH=-DSUN
gcc -g -ansi -DSUN   -c -o TestLex.o TestLex.c
gcc -g -ansi -DSUN   -c -o MachineLex.o MachineLex.c
gcc -g  TestLex.o MachineLex.o -o TestLex  
gcc -g -ansi -DSUN   -c -o TestAnalyseSynt.o TestAnalyseSynt.c
gcc -g -ansi -DSUN   -c -o AnalyseSynt.o AnalyseSynt.c
gcc -g  TestAnalyseSynt.o AnalyseSynt.o MachineLex.o -o TestAnalyseSynt
gcc -g -ansi -DSUN   -c -o assembler.o assembler.c
gcc   assembler.o   -o assembler
Undefined                       first referenced
 symbol                             in file
elf32_newehdr                       assembler.o
elf_end                             assembler.o
elf_update                          assembler.o
elf_newdata                         assembler.o
elf32_getshdr                       assembler.o
ErreurContext                       assembler.o
Analyse                             assembler.o
elf_version                         assembler.o
fmod                                assembler.o
elf_flagdata                        assembler.o
EstModeAdInst2ParL                  assembler.o
EstModeAdInst2ParW                  assembler.o
elf_begin                           assembler.o
elf_newscn                          assembler.o
elf_flagscn                         assembler.o
ld: fatal: Symbol referencing errors. No output written to assembler
collect2: ld returned 1 exit status
make: *** [assembler] Error 1


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 14:44:34    

Et tous ces symboles ils apparaissent où dans ton code?

Reply

Marsh Posté le 13-05-2003 à 15:05:54    

/* -------------------------------------------------------------
 *         assembler.c
 *         FM 1er avril 2003
 *    
 *         Apres la phase d'analyse syntaxique minimale realisee
 *         par Analyse(), verifications contextuelles et production
 *         du fichier objet au format ELF
 *
 * Fournit la fonction main
 * -------------------------------------------------------------
 */
#include <stdio.h>  
 
#include  "AA.h"
#include  "AnalyseSynt.h"
#include  "importelf.h"
 
 
#include <fcntl.h>  
#include <stdlib.h>  
#include <elf.h>
#include <string.h>  
#include <limits.h>  
 
#include  <sys/types.h>
#include  <sys/stat.h>
 
 
/*#include  <string.h>
#include  <errno.h>*/
 
 
/* Tables pour VerifInst  
 * -----------------------
 */
 
static char *tableNomsRegs32 [] = {
 "%eax",  
 "%ecx",
 "%edx",
 "%ebx",
 "%esp",
 "%ebp",
 "%esi",
 "%edi",
 " "  
} ;
 
static char *tableNomsRegs16 [] = {
 "%ax",    
 "%cx",
 "%dx",
 "%bx",
 "%sp",
 "%bp",
 "%si",
 "%di",
 " "
} ;
 
static char *tableNomsRegs8 [] = {
 "%al",    
 "%cl",
 "%dl",
 "%bl",
 "%ah",  
 "%ch",
 "%dh",
 "%bh",
 " "  
} ;
 
 
 static char *tableInstructions2ParB [] = {
 "addb",
 "andb",
 "cmpb",
 "movb",
 "orb",
 "subb",
 "xorb",
 " "
} ;
 
static char *tableInstructions2ParW [] = {
 "addw",
 "andw",
 "cmpw",
 "movw",
 "orw",
 "subw",
 "xorw",
 " "
} ;
 
static char *tableInstructions2ParL [] = {
 "addl",
 "andl",
 "cmpl",
 "movl",
 "orl",
 "subl",
 "xorl",
 " "
} ;
 
static char *tableSautCond [] = {
 "ja",
 "jae",
 "jb",
 "jbe",
 "je",
 "jg",
 "jge",
 "jl",
 "jle",
 "jne",
 " "
} ;
 
 
   
 
/* Types pour ELF  
 * --------------
 */
typedef struct {  
        Elf_Scn  *TextSection ;
        Elf_Scn  *DataSection ;
        Elf_Scn  *BssSection ;
        Elf_Scn  *SymbolTable ;
        Elf_Scn  *StringTable ;
        Elf_Scn  *RelocTextSection ;
        Elf_Scn  *RelocDataSection ;
    } SectionDescriptors ;
 
    typedef struct {
        int     TextNameIndex ;
        int     DataNameIndex ;
        int     BssNameIndex ;
        int     SymbolTableNameIndex ;
        int     StringTableNameIndex ;
        int     RelocTextNameIndex ;
        int     RelocDataNameIndex ;
    } NameIndexes ;
 
 
 
/* Pre-declarations des procedures et fonctions  
 * --------------------------------------------
 */
static int   Verif      (Elem *, int) ;
static void  Decoration (Elem *, int) ;  
static void  Remplir_Listing (Elem *, int, FILE *) ;
static void  GenererObjet    (Elf *) ;
static void  GenerateHeader (Elf *, SectionDescriptors *, NameIndexes *) ;
static void  CreateTableOfSectionNames (Elf *, NameIndexes *) ;
static void  GenerateTextAndReloc  (Elf *, Elf_Scn *, Elf_Scn *, int , int );
 
 
static  void    GenerateTextAndReloc
        (Elf *, Elf_Scn *, Elf_Scn *, int , int );
static  void    GenerateDataAndReloc
        (Elf *, Elf_Scn *, Elf_Scn *, int , int ) ;
static  void    GenerateBss     (Elf *, Elf_Scn *, int )  ;
static  void    GenerateSymbTab (Elf *, Elf_Scn *, int )  ;
static  void    GenerateCharTab (Elf *, Elf_Scn *, int )  ;
 
static  void    SetSHDR (                    Elf32_Shdr *shdr,
                     Elf32_Word sh_name,    /* section name */
                     Elf32_Word sh_type,    /* SH_... */
                     Elf32_Word sh_flags,   /* SHF_... */
                     Elf32_Addr sh_addr,    /* virtual address */
                     Elf32_Off  sh_offset,  /* file offset */
                     Elf32_Word sh_size,    /* section size */
                     Elf32_Word sh_link,    /* misc info */
                     Elf32_Word sh_info,    /* misc info */
                     Elf32_Word sh_addralign,   /* memory alignment */
                     Elf32_Word sh_entsize  /* entry size if table */
                )   ;    
 
static void SetDATA (Elf_Data   *, Elf_Type, size_t, off_t, size_t);
 
static void SetSYMBOL (Elf32_Sym *, int, Elf32_Word,  
                       Elf32_Addr, unsigned char, Elf32_Half) ;
 
/* ---------------------------------------------------------------
 * SetDATA  
 * - Installation d'un bloc de donnees du format ELF  
 * ---------------------------------------------------------------  
 */
static void SetDATA (Elf_Data   *data,  
                     Elf_Type   d_type,
                     size_t     d_size,
                     off_t      d_off,
                     size_t     d_align)
{
  data->d_type = d_type ;
  data->d_size = d_size ;
  data->d_off = d_off ;
  data->d_align =  d_align ;
  data->d_version = EV_CURRENT  ;
  if (d_size)  
 data->d_buf = malloc ( d_size);  
  else  
 data->d_buf = NULL ;
}  
/* ---------------------------------------------------------------
 * SetSYMBOL
 * ---------------------------------------------------------------  
 */
static void SetSYMBOL (Elf32_Sym *psymb, int index, Elf32_Word nameindex,  
                       Elf32_Addr value, unsigned char info, Elf32_Half sectionindex)  
{  
  (psymb+index)->st_name  = nameindex ;
  (psymb+index)->st_value = value ;
  (psymb+index)->st_size  = 0 ;
  (psymb+index)->st_info  = info ;
  (psymb+index)->st_other = 0 ;
  (psymb+index)->st_shndx = sectionindex;
}
 
/* ---------------------------------------------------------------
 * SetSHDR
 * ---------------------------------------------------------------  
 */
static void SetSHDR (    
                     Elf32_Shdr *shdr,
                     Elf32_Word sh_name,    /* section name */
                     Elf32_Word sh_type,    /* SHT_... */
                     Elf32_Word sh_flags,   /* SHF_... */
                     Elf32_Addr sh_addr,    /* virtual address */
                     Elf32_Off  sh_offset,  /* file offset */
                     Elf32_Word sh_size,    /* section size */
                     Elf32_Word sh_link,    /* misc info */
                     Elf32_Word sh_info,    /* misc info */
                     Elf32_Word sh_addralign,   /* memory alignment */
                     Elf32_Word sh_entsize  /* entry size if table */
)
{
  shdr->sh_name = sh_name ;  
  shdr->sh_type = sh_type ;
  shdr->sh_flags =  sh_flags;
  shdr->sh_addr = sh_addr ;
  shdr->sh_offset =sh_offset ;
  shdr->sh_size = sh_size;
  shdr->sh_link = sh_link ;
  shdr->sh_info = sh_info ;
  shdr->sh_addralign = sh_addralign;
  shdr->sh_entsize = sh_entsize ;
}
/* ---------------------------------------------------------------
 * main - assembleur  
 * ---------------------------------------------------------------  
 */
int  main (int argc, char *argv[]) {
 
FILE  *inputf ;      /* descripteur de fichier d'entree */
int   result_analyse ;      /* resultat de la premiere phase d'analyse. 0 si ok */
int   result_verif   ;      /* resultat de la phase d'analyse contextuelle.
                            0 si ok. */
FILE  *p_fd_listing ;       /* descripteur du listing de sortie */
int   fd_object ;           /* descripteur de fichier de sortie */
int   fd_listing        ;    /* descripteur du fichier de listing */
char  nom_listing [100] ;    /* nom du fichier contenant le listing d assemblage */
char  nom_out [100] ;        /* nom du fichier de sortie */
Elf   *elf ;                 /* descripteur du fichier ELF de sortie */
int   modif_fich_sortie ;    /* booleen modifie par la presence de l option -o */
int   trace          ;    /* booleen modifie par la presence de l option -v */
 
/* sdd interne a remplir par analyse et a retravailler ensuite */
 static Elem LeProg [MAX_LIGNES_LOG] ;
 int  nbLigneLog ;  
 
 
 
/* -----------------------------------------------------------------------------------
 * Analyse des arguments de la ligne de commande
 * Possibilite d option
 * -v : pour des informations sur le deroulement du programme
 * -o <nom> : pour choisir le nom du fichier de sortie
 * -----------------------------------------------------------------------------------
 */
 modif_fich_sortie = 0 ;
 trace = 0 ;
 
 switch (argc) {
  case 2 : break ;
    sprintf(nom_out, "%s.o", argv[1]) ;
  case 3 : if (!strcmp (argv[2], "-v" )) {
    trace = 1 ;
    sprintf(nom_out, "%s.o", argv[1]) ;
    break ;  
    }
    else {
    printf ("\n%s : option invalide : %s\n\n",  
    argv[0], argv [2]);
    exit (1) ;
    }
  case 4 : if (!strcmp (argv[2], "-o" )) {
    sprintf(nom_out, "%s.o", argv[3]) ;
    break ;  
    }
    else {
    printf ("\n%s : option invalide : %s\n\n",  
    argv[0], argv [2]);
    exit (1) ;
    }
  default : printf ("\n%s : nombre de parametres de commande incorrect \n\n",
     argv[0]) ;
     exit (1) ;
 }
 
 if ((inputf = fopen(argv[1], "r" )) == NULL) {
    printf("%s : impossible d'ouvrir : %s\n", argv[0], argv[1]);
    exit(1);
 }
 
 if (trace)
  printf  
("\n************************************************************
* Verification de la ligne de commande achevee avec succes *
************************************************************ \n\n" ) ;  
 
 
 
/* -----------------------------------------------------------------------------------
 * Analyse - phase 1 : remplit les structures de donnees de AA.h
 * Arret a la premiere erreur detectee
 * On produira tout de meme un listing avec le fichier incomplet
 * par contre pas de fichier binaire relogeable
 * -----------------------------------------------------------------------------------
 */
 result_analyse = Analyse (inputf, LeProg, &nbLigneLog) ;
 if (result_analyse != 0)  
  printf ("\n%s : erreur de syntaxe - poursuite \n\n",
  argv[0]) ;
 
 close (inputf) ;
 
  if (trace)
  printf  
("\n****************************
* Analyse lexicale achevee *
**************************** \n\n" ) ;
 
 
 
/* -----------------------------------------------------------------------------------
 * Analyse - phase 2 : verifications contextuelles
 * pas de double definition d etiquette, modes d adressage autorises
 * taille demandee positive pour reservations non initialisees
 * taille de zone reservee suffisante pour stocker une donnee initialisante
 * borne d alignement positive
 * -----------------------------------------------------------------------------------
 */
 
 result_verif = Verif (LeProg, nbLigneLog) ;
 if (result_verif != 0)  
  printf ("\n%s : erreur de syntaxe contextuelle - poursuite \n\n",
  argv[0]) ;
 
  if (trace)
  printf  
("\n****************************************
* Verifications contextuelles achevees *
**************************************** \n\n" ) ;
 
 
 
 
/* Enrichissement de la structure de donnees
 * calcul des valeurs et des zones de def des symboles,...  
 * ----------------------------------------------------
 */
 
 Decoration (LeProg, nbLigneLog) ;
 
 
 
 
 
/* -----------------------------------------------------------------------------------
 * Production du listing d assemblage
 * -----------------------------------------------------------------------------------
 */
 
 sprintf (nom_listing, "%s.l", inputf) ;
 
 /* ouverture d un fichier de listing en ecriture */
 unlink (nom_listing) ;
 p_fd_listing = fopen (nom_listing, "w" ) ;
 
 if (fd_listing == -1) {
  perror ("Kerala(linux-pentium)" ) ;
  exit (1) ;
 }
 fchmod (fd_listing, S_IRUSR|S_IWUSR) ;
 
 Remplir_Listing (LeProg, nbLigneLog, p_fd_listing) ;
 
 
 
/* Generation de code =
 * production du fichier ELF  
 * -------------------------
 */
 
 sprintf (nom_out, "out.o" ) ;
 
 /* ouverture d'un fichier ELF en ecriture */
 unlink (nom_out);  
    fd_object = open(nom_out, O_WRONLY|O_CREAT|O_TRUNC) ;  
 
    if (fd_object == -1) {
        perror ("Kerala(linux-pentium)" ) ;
        exit(1);  
    }
    fchmod (fd_object, S_IRUSR|S_IWUSR);
 
    /* coordinate versions of the ELF library */
    (void) elf_version(EV_CURRENT);
 
    /* Obtain the ELF descriptor */
    if ((elf = elf_begin(fd_object, ELF_C_WRITE, NULL)) == NULL)
     exit(1);
 
 GenererObjet (elf) ;
 
    elf_update (elf,ELF_C_WRITE) ;
    elf_end (elf);  
    close (fd_object) ;
 
 
}
 
 
/* pre-declarations - voir ci-dessous */
static int VerifInst (Elem) ;
static int VerifReservInit(Elem) ;
 
 
/* Fonctions tests */
 
int EstReg32 (char *nom) {
 int i ;
 for (i = 0; ; i++) {
  if (!strcmp (" ", tableNomsRegs32 [i]))
   break ;
  if (!strcmp (nom, tableNomsRegs32 [i]))
   return 1 ;
 }
 return 0 ;
}
 
int EstReg16 (char *nom) {
 int i ;
 for (i = 0; ; i++) {
  if (!strcmp (" ", tableNomsRegs16 [i]))
   break ;
  if (!strcmp (nom, tableNomsRegs16 [i]))
   return 1 ;
 }
 return 0 ;
}
 
int EstReg8 (char *nom) {
 int i ;
 for (i = 0; ; i++) {
  if (!strcmp (" ", tableNomsRegs8 [i]))
   break ;
  if (!strcmp (nom, tableNomsRegs8 [i]))
   return 1 ;
 }
 return 0 ;
}
 
int EstValImm8 (long val) {
 if ((val < SHRT_MIN ) || (val > USHRT_MAX ))
  return 0;
 else return 1;
}
 
int EstValImm16 (long val) {
 if ((val < INT_MIN) || (val > UINT_MAX))
  return 0;
 else return 1;
}
 
int EstValSigne8 (long val){
if ((val < SHRT_MIN ) || (val > SHRT_MAX ))
  return 0;
 else return 1;
}
 
/* ------------------------------------------------------------------------  
*/
 
int EstInst2ParB (char *nom) {
 int i ;
 for (i = 0; ; i++) {
  if (!strcmp (" ", tableInstructions2ParB [i]))
   break ;
  if (!strcmp (nom, tableInstructions2ParB [i]))
   return 1 ;
 }
 return 0 ;
}
 
int EstInst2ParW (char *nom) {
 int i ;
 for (i = 0; ; i++) {
  if (!strcmp (" ", tableInstructions2ParW [i]))
   break ;
  if (!strcmp (nom, tableInstructions2ParW [i]))
   return 1 ;
 }
 return 0 ;
}
 
int EstInst2ParL (char *nom) {
 int i ;
 for (i = 0; ; i++) {
  if (!strcmp (" ", tableInstructions2ParL [i]))
   break ;
  if (!strcmp (nom, tableInstructions2ParL [i]))
   return 1 ;
 }
 return 0 ;
}
 
int EstSautCond (char *nom) {
 int i ;
 for (i = 0; ; i++) {
  if (!strcmp (" ", tableSautCond [i]))
   break ;
  if (!strcmp (nom, tableSautCond [i]))
   return 1 ;
 }
 return 0 ;
}
 
/* --------------------------------------------------------------------------------------------------  
*/
 
/* predeclarations */
int EstModeAdInst2ParB (NatParam, Param, NatParam, Param) ;
int EstModeAdInst2parW (NatParam, Param, NatParam, Param) ;
int EstModeAdInst2parL (NatParam, Param, NatParam, Param) ;
 
int EstModeAdInst2ParB (NatParam natp0, Param p0, NatParam natp1, Param p1) {
  switch (natp0) {
  case P_NOMREG      :
    if (EstReg8(p0.u.nomreg)&&(((natp1 == P_NOMREG)&&EstReg8(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
        ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_NB   :
    if (EstValImm8(p0.u.dollar_nb)&&(((natp1 == P_NOMREG)&&EstReg8(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
           ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_ETIQ :
    if (((natp1 == P_NOMREG)&&EstReg8(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_INDIR       :
    if ((p0.u.indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg8(p1.u.nomreg))))
      return 1;
  case P_INDEX_INDIR :
    if ((p0.u.index_indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg8(p1.u.nomreg))))
      return 1;
  case P_NOMBRE      :
  case P_ETIQUETTE   :
    if ((natp1==P_NOMREG) && (EstReg8(p1.u.nomreg)))
      return 1;
  default:
    return 0 ;
  }
}
   
 
int EstModeAdInst2parW (NatParam natp0, Param p0, NatParam natp1, Param p1) {
  switch (natp0) {
  case P_NOMREG      :
    if (EstReg16(p0.u.nomreg)&&(((natp1 == P_NOMREG)&&EstReg16(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
        ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_NB   :
    if (EstValImm16(p0.u.dollar_nb)&&(((natp1 == P_NOMREG)&&EstReg16(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
           ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_ETIQ :
    if (((natp1 == P_NOMREG)&&EstReg16(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_INDIR       :
    if ((p0.u.indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg16(p1.u.nomreg))))
      return 1;
  case P_INDEX_INDIR :
    if ((p0.u.index_indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg16(p1.u.nomreg))))
      return 1;
  case P_NOMBRE      :
  case P_ETIQUETTE   :
    if ((natp1==P_NOMREG) && (EstReg16(p1.u.nomreg)))
      return 1;
  default:
    return 0 ;
  }
}
   
 
 
int EstModeAdInst2parL (NatParam natp0, Param p0, NatParam natp1, Param p1) {
  switch (natp0) {
  case P_NOMREG      :
    if (EstReg32(p0.u.nomreg)&&(((natp1 == P_NOMREG)&&EstReg32(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
        ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_NB   :
    if (((natp1 == P_NOMREG)&&EstReg32(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_DOLLAR_ETIQ :
    if (((natp1 == P_NOMREG)&&EstReg32(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_INDIR       :
    if ((p0.u.indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg32(p1.u.nomreg))))
      return 1;
  case P_INDEX_INDIR :
    if ((p0.u.index_indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg32(p1.u.nomreg))))
      return 1;
  case P_NOMBRE      :
  case P_ETIQUETTE   :
    if ((natp1==P_NOMREG) && (EstReg32(p1.u.nomreg)))
      return 1;
  default:
    return 0 ;
  }
}
   
 int EstModeAdLea (NatParam natp0, Param p0, NatParam natp1, Param p1){
   if (natp1==P_NOMREG){
     switch(natp0) {
     case P_INDIR :
       if (((p0.u.indir.nbreg == 1)&&(EstReg32(p0.u.indir.nomreg1)))&&
         ((natp1 == P_NOMREG)&&EstReg32(p1.u.indir.nomreg1)))
  return 1;
     case P_INDEX_INDIR :
       if (((p0.u.index_indir.nbreg == 1)&&EstReg32(p0.u.index_indir.nomreg1))&&
         ((natp1 == P_NOMREG)&&EstReg32(p1.u.indir.nomreg1)))
  return 1;
     case P_NOMBRE :
     case P_ETIQUETTE :
       if ((natp1==P_NOMREG) && (EstReg32(p1.u.nomreg)))  
         return 1;
     default :
       return 0;
     }
   }
 }
 
 int EstModeAdPopw (NatParam natp0, Param p0){
   switch(natp0) {
   case P_INDIR :
       if ((p0.u.indir.nbreg == 1)&&(EstReg32(p0.u.indir.nomreg1)))
  return 1;
   case P_INDEX_INDIR :
     if ((p0.u.index_indir.nbreg == 1)&&EstReg32(p0.u.index_indir.nomreg1))
       return 1;
   case P_NOMBRE :
   case P_ETIQUETTE :
     return 1;
   case P_NOMREG :
     if (EstReg16(p0.u.nomreg))
       return 1;
   default :
     return 0;
   }
 }
 
 
 
 
on va arreter la :/


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 15:20:23    

Je ne connais pas du tout elf.h, mais j'ai supposé que tu développais sous un unix (au hasard...), et j'ai cherché un peu avec google...
J'ai trouvé ca:
http://www.mcsr.olemiss.edu/cgi-bin/man-cgi?elf+3
 
Ils parlent ici de libelf.h (un équivalent??), mais surtout ils spécifient que son utilisation requiert un flag -lelf à la compil:

Citation :


     cc [flag ...] file ...  -lelf [library ...]

Reply

Marsh Posté le 13-05-2003 à 15:26:07    

tu as vraiment une boule de cristal ;)
 
je vais verifier ca...


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 15:38:33    

j avais fait des betises avec mon makefile :/
 
par contre il me reste encore
EstModeAdInst2ParL                  assembler.o
EstModeAdInst2ParW                  assembler.o
 
 
alors que ca passe pour  
EstModeAdInst2ParB


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 16:14:35    

up :/


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 16:14:35   

Reply

Marsh Posté le 13-05-2003 à 16:37:02    

Dans mon prog j ai les fonctions
 
int EstModeAdInst2ParB (NatParam natp0, Param p0, NatParam natp1, Param p1) {
  switch (natp0) {
  case P_NOMREG      :
    if (EstReg8(p0.u.nomreg)&&(((natp1 == P_NOMREG)&&EstReg8(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
        ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_NB   :
    if (EstValImm8(p0.u.dollar_nb)&&(((natp1 == P_NOMREG)&&EstReg8(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
           ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_ETIQ :
    if (((natp1 == P_NOMREG)&&EstReg8(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_INDIR       :
    if ((p0.u.indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg8(p1.u.nomreg))))
      return 1;
  case P_INDEX_INDIR :
    if ((p0.u.index_indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg8(p1.u.nomreg))))
      return 1;
  case P_NOMBRE      :
  case P_ETIQUETTE   :
    if ((natp1==P_NOMREG) && (EstReg8(p1.u.nomreg)))
      return 1;
  default:
    return 0 ;
  }
}
   
 
int EstModeAdInst2parW (NatParam natp0, Param p0, NatParam natp1, Param p1) {
  switch (natp0) {
  case P_NOMREG      :
    if (EstReg16(p0.u.nomreg)&&(((natp1 == P_NOMREG)&&EstReg16(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
        ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_NB   :
    if (EstValImm16(p0.u.dollar_nb)&&(((natp1 == P_NOMREG)&&EstReg16(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
           ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_ETIQ :
    if (((natp1 == P_NOMREG)&&EstReg16(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_INDIR       :
    if ((p0.u.indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg16(p1.u.nomreg))))
      return 1;
  case P_INDEX_INDIR :
    if ((p0.u.index_indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg16(p1.u.nomreg))))
      return 1;
  case P_NOMBRE      :
  case P_ETIQUETTE   :
    if ((natp1==P_NOMREG) && (EstReg16(p1.u.nomreg)))
      return 1;
  default:
    return 0 ;
  }
}
   
 
 
int EstModeAdInst2parL (NatParam natp0, Param p0, NatParam natp1, Param p1) {
  switch (natp0) {
  case P_NOMREG      :
    if (EstReg32(p0.u.nomreg)&&(((natp1 == P_NOMREG)&&EstReg32(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
        ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE)))
      return 1;
  case P_DOLLAR_NB   :
    if (((natp1 == P_NOMREG)&&EstReg32(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_DOLLAR_ETIQ :
    if (((natp1 == P_NOMREG)&&EstReg32(p1.u.nomreg)) || ((natp1==P_INDIR)&&(p1.u.indir.nbreg == 1)) ||  
     ((natp1==P_INDEX_INDIR)&&(p1.u.index_indir.nbreg == 1)) || (natp1==P_NOMBRE)  || (natp1==P_ETIQUETTE))
      return 1;
  case P_INDIR       :
    if ((p0.u.indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg32(p1.u.nomreg))))
      return 1;
  case P_INDEX_INDIR :
    if ((p0.u.index_indir.nbreg == 1)&&((natp1==P_NOMREG) && (EstReg32(p1.u.nomreg))))
      return 1;
  case P_NOMBRE      :
  case P_ETIQUETTE   :
    if ((natp1==P_NOMREG) && (EstReg32(p1.u.nomreg)))
      return 1;
  default:
    return 0 ;
  }
}
 
 
 
ceci est ecrit avant qu on les appelle dans le programme principal...
 
et j ai toujours
Undefined                       first referenced
 symbol                             in file
EstModeAdInst2ParL                  assembler.o
EstModeAdInst2ParW                  assembler.o
 


---------------
Les accents sont en option... j'ai un clavier qwertz.
Reply

Marsh Posté le 13-05-2003 à 16:45:30    

/* predeclarations */  
int EstModeAdInst2ParB (NatParam, Param, NatParam, Param) ;  
int EstModeAdInst2parW (NatParam, Param, NatParam, Param) ;  
int EstModeAdInst2parL (NatParam, Param, NatParam, Param) ;  
 
Les différences de capitalisation Par/par, normal ?

Reply

Marsh Posté le 13-05-2003 à 18:04:03    

oui c etait ca...
 
merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed