redefinition incomprehensible :'(

redefinition incomprehensible :'( - C - Programmation

Marsh Posté le 06-04-2006 à 16:34:50    

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

Reply

Marsh Posté le 06-04-2006 à 16:34:50   

Reply

Marsh Posté le 06-04-2006 à 16:38:04    

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.

Reply

Marsh Posté le 06-04-2006 à 17:00:51    

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/
Reply

Marsh Posté le 06-04-2006 à 17:02:20    

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/
Reply

Marsh Posté le 06-04-2006 à 17:09:13    

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

Reply

Marsh Posté le 06-04-2006 à 17:14:17    

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

Reply

Marsh Posté le 06-04-2006 à 17:16:30    

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

Reply

Marsh Posté le 06-04-2006 à 17:24:34    

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"

Reply

Marsh Posté le 06-04-2006 à 17:55:01    

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

Reply

Marsh Posté le 06-04-2006 à 18:01:01    

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

Reply

Marsh Posté le 06-04-2006 à 18:01:01   

Reply

Marsh Posté le 06-04-2006 à 18:05:38    

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

Reply

Marsh Posté le 06-04-2006 à 18:07:02    

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

Reply

Marsh Posté le 06-04-2006 à 18:07:08    

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 ?

Reply

Marsh Posté le 06-04-2006 à 18:07:56    

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

Reply

Marsh Posté le 06-04-2006 à 18:20:23    

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)
Reply

Marsh Posté le 07-04-2006 à 12:59:27    

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

Reply

Marsh Posté le 07-04-2006 à 14:03:00    

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
Reply

Marsh Posté le 07-04-2006 à 14:05:53    

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

Reply

Marsh Posté le 07-04-2006 à 14:09:28    

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);


?

Reply

Marsh Posté le 07-04-2006 à 14:21:00    

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

Reply

Marsh Posté le 07-04-2006 à 17:01:44    

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/
Reply

Marsh Posté le 07-04-2006 à 20:27:18    

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

Reply

Marsh Posté le 08-04-2006 à 13:30:35    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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