redefinition incomprehensible :'( - C - Programmation
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.
Marsh Posté le 06-04-2006 à 17:00:51
Elmoricq a écrit : Hmm. Pourquoi tu nous mets le bout de code ASM ? |
Je pense qu'il fait du mix C/assembleur...
Marsh Posté le 06-04-2006 à 17:02:20
slybibi a écrit :
|
C'est bizarre comme syntaxe. C'est quoi ton assembkeur ?
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 donc je comprend pas :s
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
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"
Marsh Posté le 06-04-2006 à 17:55:01
hummm comment il pourrait prendre 2 fois le context_switch.o ?
Marsh Posté le 06-04-2006 à 18:01:01
tu peux monter la ligne de commande avec laquel tu fais l'edition des liens ?
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
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
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 ?
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
Marsh Posté le 07-04-2006 à 12:59:27
Citation : .text |
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
Marsh Posté le 07-04-2006 à 14:03:00
slybibi a écrit : Bonjour, |
Salut,
ca serait pas plutot un truc du genre
Code :
|
(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++?)
Marsh Posté le 07-04-2006 à 14:05:53
ReplyMarsh 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
ca serait donc plutot
Code :
|
?
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
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'.
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
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
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