Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1852 connectés 

  FORUM HardWare.fr
  Programmation
  C

  redefinition incomprehensible :'(

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

redefinition incomprehensible :'(

n°1340787
slybibi
Posté le 06-04-2006 à 16:34:50  profilanswer
 

Bonjour,
J'ai un probleme vraiment bizarre.
J'ai un programme context_switch.S qui contient :
 
.text
   
.global context_switch
 
context_switch :
         movl 4(%esp),%eax
                etc ...
 
et je definit context_switch dans le .h :
 
void context_switch(contexte_exec *old_context, contexte_exec *new_context);
 
et quand je compile il met dit que context_switch est défini 2 fois ... au même endroit :s  :
 
context_switch.o: In function `context_switch':
context_switch.o(.text+0x0): multiple definition of `context_switch'
context_switch.o(.text+0x0): first defined here
make: *** [kernel.bin] Erreur 1
 
Ca fait un bout de temps que je cherche mais là je vois vraiment pas ... :'( si qqun a une idée ...
merci d'avance

mood
Publicité
Posté le 06-04-2006 à 16:34:50  profilanswer
 

n°1340794
Elmoricq
Modérateur
Posté le 06-04-2006 à 16:38:04  profilanswer
 

Hmm. Pourquoi tu nous mets le bout de code ASM ?
 
Vaut mieux le source en C, avec la définition de la fonction context_switch(), pour pouvoir la comparer avec ce qu'il y a dans ton fichier en-tête.

n°1340818
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-04-2006 à 17:00:51  profilanswer
 

Elmoricq a écrit :

Hmm. Pourquoi tu nous mets le bout de code ASM ?
 
Vaut mieux le source en C, avec la définition de la fonction context_switch(), pour pouvoir la comparer avec ce qu'il y a dans ton fichier en-tête.


Je pense qu'il fait du mix C/assembleur...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1340820
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-04-2006 à 17:02:20  profilanswer
 

slybibi a écrit :


J'ai un programme context_switch.S qui contient :


.text
   
.global context_switch
 
context_switch :
         movl 4(%esp),%eax



C'est bizarre comme syntaxe. C'est quoi ton assembkeur ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1340827
slybibi
Posté le 06-04-2006 à 17:09:13  profilanswer
 

Effectivement ma fonction est codée en assembleur et pas en C (c'est de la programmation systeme je suis obligé)
Et en ce qui concerne la syntaxe de l'assembleur j'ai fait un gestionnaire d'irq avec la mm syntaxe qui marche tres bien :p donc je comprend pas :s

n°1340833
skelter
Posté le 06-04-2006 à 17:14:17  profilanswer
 

Emmanuel Delahaye a écrit :

C'est bizarre comme syntaxe. C'est quoi ton assembkeur ?


 
ce n'est pas lié à l'assembleur, c'est la syntaxe at&t utilisé par l'assembleur gnu as par exemple

n°1340837
Elmoricq
Modérateur
Posté le 06-04-2006 à 17:16:30  profilanswer
 

Ah, ok.
J'avoue ma totale incompétence dans ce domaine. :/

n°1340851
skelter
Posté le 06-04-2006 à 17:24:34  profilanswer
 

la seul explication que je vois c'est que tu passes au linker 2 context_switch.o (peut etre le meme) définissant un symbole global "context_switch"

n°1340877
slybibi
Posté le 06-04-2006 à 17:55:01  profilanswer
 

hummm comment il pourrait prendre 2 fois le context_switch.o  ?

n°1340880
skelter
Posté le 06-04-2006 à 18:01:01  profilanswer
 

tu peux monter la ligne de commande avec laquel tu fais l'edition des liens ?

mood
Publicité
Posté le 06-04-2006 à 18:01:01  profilanswer
 

n°1340883
slybibi
Posté le 06-04-2006 à 18:05:38  profilanswer
 

hummm normalement j'ai un makefile beton qui a fait ces preuves :
 
# Files to compile
FILES=$(wildcard *.S *.c) printf.c sprintf.c doprnt.c panic.c div64.c
DIRS=. ../shared
 
# crt0.o must be the first object linked
OBJS=$(strip crt0.o $(filter-out crt0.o,$(notdir $(patsubst %.S,%.o,$(patsubst %.c,%.o,$(FILES))))))
 
CC=gcc
AS=gcc
LD=ld
 
KFLAGS=-Wall -g -gstabs -pipe -std=c99 -nostdinc
#KFLAGS=-Wall -O2 -fomit-frame-pointer -pipe -std=c99 -nostdinc
 
DEF=-D__KERNEL__
INC=$(patsubst %,-I%,$(DIRS))
CCL=$(CC) -Werror $(KFLAGS) $(DEF) $(INC)
ASL=$(AS) -DASSEMBLER $(DEF) $(INC)
DEPS=$(patsubst %.o,%.d,$(OBJS))
 
# Where to search for source files
vpath %.c $(DIRS)
vpath %.h $(DIRS)
vpath %.S $(DIRS)
 
# Targets that are not files
.PHONY: clean all user kbd_linux
 
# The default target
all: user kbd_linux kernel.bin
 if [ -d /osmon ]; then rm -f /osmon/kernel.bin; cp -f kernel.bin /osmon; fi
 if [ -d /noyaux ]; then rm -f /noyaux/kernel.bin; cp -f kernel.bin /noyaux; fi
 if [ -d /vmware/noyaux/`whoami` ]; then rm -f /vmware/noyaux/`whoami`/kernel.bin; cp -f kernel.bin /vmware/noyaux/`whoami`/; fi
 
user:
 $(MAKE) -C ../user
 
kbd_linux:
 $(MAKE) -C kbd_linux
 
# Automatic rules to build dependency files
%.d: %.c
 @$(SHELL) -ec '$(CCL) -M $< | sed '\''s|\($*\)\.o[ :]*|\1.o $@ : Makefile |g'\'' > $@; [ -s $@ ] || rm -f $@'
 
%.d: %.S
 @$(SHELL) -ec '$(ASL) -M $< | sed '\''s|\($*\)\.o[ :]*|\1.o $@ : Makefile |g'\'' > $@; [ -s $@ ] || rm -f $@'
 
# Build and include dependency files
-include $(DEPS)
 
# Automatic rules to build the object files
%.o: %.S
 $(ASL) -c $< -o $@
 
%.o: %.c
 $(CCL) -c $< -o $@
 
%.s: %.c
 $(CCL) -S -c $< -o $@
 
# Wrap the user program in an object file. Note that although the user program
# is wrapped into the kernel, they are not linked together.
userdata.o: empty.o ../user/user.bin
 objcopy empty.o --add-section=.user=../user/user.bin --set-section-flags=.user=contents,alloc,load,data userdata.o
 
# Generate the kernel, ready to run
kernel.bin: kernel.lds $(OBJS) userdata.o kbd_linux/kbd_linux.o
 $(LD) -e entry -Tkernel.lds $(OBJS) userdata.o kbd_linux/kbd_linux.o -o $@
 
clean:
 make -C kbd_linux clean
 rm -f $(OBJS) $(DEPS) kernel.bin userdata.o

n°1340884
skelter
Posté le 06-04-2006 à 18:07:02  profilanswer
 

context_switch/context_swicth.o est peut etre présent dans une bibliotheque liée par défaut (avec un nom pareil c'est probable, surtout que google en retourne des tonnes sur context_switch/.h.c), essaies en changeant le nom de ta fonction

n°1340885
slybibi
Posté le 06-04-2006 à 18:07:08  profilanswer
 

Toujours plus fort : je travail avec un pote avec svn (gestionnaire de versions) et on a donc exactement les memes fichiers et ... chez lui ca compile ... :s
Qqun a une corde ?

n°1340886
slybibi
Posté le 06-04-2006 à 18:07:56  profilanswer
 

en changeant le nom de la fonction pas plus de resultats :/

n°1340891
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-04-2006 à 18:20:23  profilanswer
 

Emmanuel Delahaye a écrit :

C'est bizarre comme syntaxe. C'est quoi ton assembkeur ?


c'est la syntaxe AT&T, la plus pourrie qui soit ! je déteste cette syntaxe de merde [:benou]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1341395
db__
spécialiste de l'à peu près
Posté le 07-04-2006 à 12:59:27  profilanswer
 

Citation :

.text
   
.global context_switch
 
context_switch :


je n'aime pas mieux que notre modérateur la syntaxe AT & T; une chose m'interpelle tout de même
normallement le . sert à déclarer un segment.
donc il y a un segment .global context_switch et l'éditeur de lien doit pas aimer.
j'essaierais donc de supprimer le . devant global.
En NASM ce serait une erreur, ce n'est peut être pas le cas en AT & T
à noter que ce sujet serait plus à classer assembleur que C

n°1341448
breizhbugs
Posté le 07-04-2006 à 14:03:00  profilanswer
 

slybibi a écrit :

Bonjour,
...
et je definit context_switch dans le .h :
void context_switch(contexte_exec *old_context, contexte_exec *new_context);


 
Salut,
ca serait pas plutot un truc du genre

Code :
  1. extern "C" void context_switch(contexte_exec *old_context, contexte_exec *new_context);


 
(Enfin faut pas dire au compilo/linker que la fonction vient d'ailleurs?)(je suis pas sur pour le "C" il me semble que c'est pour du C++?)


Message édité par breizhbugs le 07-04-2006 à 14:08:27
n°1341451
skelter
Posté le 07-04-2006 à 14:05:53  profilanswer
 

ici c'est la cat C, extern "C" c'est du C++

n°1341455
breizhbugs
Posté le 07-04-2006 à 14:09:28  profilanswer
 

skelter a écrit :

ici c'est la cat C, extern "C" c'est du C++


oui voir mon edit  :sweat:  
ca serait donc plutot

Code :
  1. extern  void context_switch(contexte_exec *old_context, contexte_exec *new_context);


?

n°1341464
skelter
Posté le 07-04-2006 à 14:21:00  profilanswer
 

j'avais jamais fais gaffe à ca mais faut croire qu'une fonction est implicitement externe si elle n'est pas static, à verifier (c'est peut etre une syntaxe pre standard plus nécéssaire maintenant ?)
 
le probleme n'est pas la, si la fonction était locale le compilateur en demanderait le code

n°1341656
Emmanuel D​elahaye
C is a sharp tool
Posté le 07-04-2006 à 17:01:44  profilanswer
 

skelter a écrit :

j'avais jamais fais gaffe à ca mais faut croire qu'une fonction est implicitement externe si elle n'est pas static, à verifier


Une fonction C est publique par défaut (with external linkage'). Elle devient privée à l'unité de compilaton courante si on ajoute le qualificateur 'static'.


Message édité par Emmanuel Delahaye le 07-04-2006 à 20:50:50

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1341770
skelter
Posté le 07-04-2006 à 20:27:18  profilanswer
 

merci
Donc déclarée une fonction "extern" est redondant, pourtant j'ai souvent vu ca

n°1342055
slybibi
Posté le 08-04-2006 à 13:30:35  profilanswer
 

bon bah finalement on a trouvé :/ comme je l'ai dit on travaillait a 2 et ce ** a fait un fichier context_switch.c donc à la compilation il créait 2 fichiers .o d'ou le fait que le linker aimait pas -________-
merci quand même pour vos idées :D

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  redefinition incomprehensible :'(

 

Sujets relatifs
Probleme incompréhensible ou j'ai du malBug incompréhensible sur IE (CSS - Mise en page)
Stack overflow incompréhensible, csq ? Un forum... symétrique !!!Erreur de segmentation incompréhensible
Probleme classe heritant vector : redéfinition erase()[Résolu] Problème d'héritage d'héritage + redéfinition de méthode
Erreur de redéfinition à la compilation.[HTML/CSS] Probleme incomprehensible [RESOLU]
[Résolu] Redéfinition de l'operateur << pour ofstreamun "cannot resolve symbol" incompréhensible
Plus de sujets relatifs à : redefinition incomprehensible :'(


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR