LINUX.ORG.RU

GCC undefined reference


0

0

Есть куча объектников но при их сборке компилер ругается на экспортируемые каждым объектником функции, при этом другими компиляторами вроде borland этот код собирается нормально. Такое впечатление что компилятор не ищет соответстия функциям в разных объектниках. Все собираю в один файл. Если пробовать делать либы то он их съедает но рождает конечный файл который содержит ссылки на либы что тупо. (.rodata+0x6c): undefined reference to `SysKeyboardHandler'


без маленького примера который бы выдавал подобные ошибки вряд ли вы получите ответ.

fghj ★★★★★
()
Ответ на: комментарий от tailgunner

есть допустим пара объектников 1 и 2. Первый экспортирует функцию из второго как extern void obj_1_func(void); Во втором определена эта функция. Если собирать сначала второй а потом первый то он не види функцию. А у меня объектники все друг на друге завязаны и нету "начала цепочки".

NoName
() автор топика
Ответ на: комментарий от NoName

ошибся, сначала первый потом второй

NoName
() автор топика
Ответ на: комментарий от NoName

> есть допустим пара объектников 1 и 2. Первый экспортирует функцию из второго как extern void obj_1_func(void);

Как всё запутано. Наверное, ты хотел написать "импотрирует из второго". Но что в этом контексте означает "собирать второй, а потом первый"? У тебя кто вообще выдает ошибки - компилятор или линковщик? Не пытайся сам сформулировать проблему, у тебя не получается. Запости команды и сообщения об ошибках.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

gcc все съедает. Когда я скармливаю все объектники линковщику ld возникает эта проблема. Т.е. когда он видит файл импортирующий функцию он пишет что такой функции нет хотя она в другом объектнике.

NoName
() автор топика
Ответ на: комментарий от tailgunner

c032.o:(.text+0x95): undefined reference to `_SysInterruptMask' c032.o:(.text+0xbc): undefined reference to `_SysTimerInit' c032.o:(.text+0xc1): undefined reference to `_SysKeyboardDriverInit' c032.o:(.text+0xef): undefined reference to `_SysPrepTasks' c032.o:(.text+0x135): undefined reference to `_SysPrepGdt' c032.o:(.text+0x19f): undefined reference to `_SysVectInit'

NoName
() автор топика

undefined reference - обычно выдает линковщик. => попробуй сгенерить отдельные объектники (gcc -c myfile.c -o myfile.o), а потом их все слинковать(gcc myfile1.o myfile2.o myfile3.o -o all_my_files).

Можно так-же компилить все взаимозависимые файлы одной коммандой.

gcc myfile1.c myfile2.c myfile3.c -o all_my_files

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

>gcc myfile1.o myfile2.o myfile3.o -o all_my_files он вызывает ld и получается тоже самое

NoName
() автор топика
Ответ на: комментарий от NoName

_SysInterruptMask, _SysKeyboardDriverInit... - твои или библиотечные функции?

YesSSS ★★★
()

Sozdayte lib`u so wsemi nugnimi funkcijami/procedurami/moduljami
zatem linkuyte s etoy liboy.

gcc program.c -LPATH_TO_YOUR_LIB -lname_of_your_lib
P.s. esli zabili kak lib`ui sdelat`:
ar cr name_of_your_lib.a object_1.o ... object_n.o
P.s.s.
naprimer, tri fayla w proekte (1.c 2.c 3.c) w kotorix washi funkcii sobiraem w lib`u
gcc -c 1.c
gcc -c 2.c
gcc -c 3.c
ar cr libsimple.a 1.o 2.o 3.o
zatem kompilliruem programmu, w kotoroy ispol`zujutsja washi funkcii opisannie w [1-3].c

gcc my_program.c -L./ -lsimple

Da, ls *.c
1.c
2.c
3.c
my_program.c

Inimi slowami, w tekushey direktorii.

Proshu izvinit` translit,
Vic.


psi
()

решается твой трабл путём двойного указания одного из обьектников типа:

gcc -o out out1.o out2.o out1.o

cvv ★★★★★
()
Ответ на: комментарий от cvv

Ничего не получается :( У меня 23 объектника и все друг на друге завязаны. Какой критерий выбора?

NoName
() автор топика
Ответ на: комментарий от NoName

попробуй их последовательность указать два или более раз подряд

или сделай с них шаренную либу а там динамический линкер сам разберётся

cvv ★★★★★
()
Ответ на: комментарий от cvv

и загони основной обтьём своих обьектников если не в динамическую то хоть в статическую либу. при таком количестве сильно упрощает жизнь

cvv ★★★★★
()
Ответ на: комментарий от cvv

если линковать с либой то он съедает и создает конечный файл с размером около 300 байт в котором как то сделаны ссылки на либы. -static не помогает.

NoName
() автор топика
Ответ на: комментарий от NoName

хех если сделать *.o он и map файл создает в котором пишет все функции хотя ругается что их нет.

NoName
() автор топика
Ответ на: комментарий от cvv

DIR_INCLUDE =./INCLUDE KERN_INCLUDE =./Kern44/INCLUDE

INIT=./OSINIT/ KERNEL=./Kern44/ LIB=./LIB/ TOOLS=./TOOLS/ VERSION=./VERSION/

PARAMS = -c -O2 -I $(DIR_INCLUDE) CC = gcc $(PARAMS) OUTOSNAME=OS.elf LINK = ld --verbose -Map OS.map -o$(OUTOSNAME) --script ld.conf ASM = ./BIN/fasm

all: $(CC) -std=c99 $(INIT)*.c $(CC) $(INIT)asm/*.c $(ASM) $(INIT)asm/c032.asm ./c032.o $(ASM) $(INIT)asm/timer.asm ./timer.o $(ASM) $(INIT)asm/keyboard.asm ./keyboard.o $(ASM) $(INIT)asm/handles.asm ./handles.o $(ASM) $(INIT)asm/setirqs.asm ./setirqs.o $(ASM) $(INIT)asm/v86subrs.asm ./v86subrs.o $(ASM) $(INIT)asm/fpemu.asm ./fpemu.o # ar cr INIT.lib *.o # rm -f *.o

$(CC) -I $(KERN_INCLUDE) -std=c99 $(KERNEL)*.c $(CC) -I $(KERN_INCLUDE) $(KERNEL)asm/*.c # ar cr KERNEL.lib *.o # rm -f *.o

$(CC) -std=c99 $(LIB)*.c # ar cr LIB.lib *.o # rm -f *.o

$(CC) -std=c99 $(TOOLS)*.c $(ASM) $(TOOLS)sysout.asm ./sysout.o # ar cr TOOLS.lib *.o # rm -f *.o

$(CC) $(VERSION)*.c # ar cr VERSION.lib *.o # $(CC) tasks.c -L./ -llibos.a

$(LINK) *.o

# $(LINK) *.o tasks.o # $(LINK) -e SysTask00 *.lib # $(LINK) tasks.o # $(LINK) tasks.o OSROM.o OSRAM.o tasks.o \ #kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o

# $(LINK) kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o # $(LINK) c032.o setirqs.o keyboard.o timer.o handles.o v86subrs.o fpemu.o rm -f *.o debug: # $(CC) -S -std=c99 $(PARAMS) $(SRC_LIB)

clean: rm -vf *~ rm -vf *.s rm -vf *.txt rm -vf *.map rm -vf *.lib rm -vf *.o rm -vf $(OUTOSNAME)

NoName
() автор топика
Ответ на: комментарий от cvv

DIR_INCLUDE =./INCLUDE
KERN_INCLUDE =./Kern44/INCLUDE

INIT=./OSINIT/
KERNEL=./Kern44/
LIB=./LIB/
TOOLS=./TOOLS/
VERSION=./VERSION/

PARAMS = -c -O2 -I $(DIR_INCLUDE)
CC = gcc $(PARAMS)
OUTOSNAME=OS.elf
LINK = ld --verbose -Map OS.map -o$(OUTOSNAME) --script ld.conf
ASM = ./BIN/fasm

all:
	$(CC) -std=c99 $(INIT)*.c
	$(CC) $(INIT)asm/*.c
	$(ASM) $(INIT)asm/c032.asm ./c032.o
	$(ASM) $(INIT)asm/timer.asm ./timer.o
	$(ASM) $(INIT)asm/keyboard.asm ./keyboard.o
	$(ASM) $(INIT)asm/handles.asm ./handles.o
	$(ASM) $(INIT)asm/setirqs.asm ./setirqs.o
	$(ASM) $(INIT)asm/v86subrs.asm ./v86subrs.o
	$(ASM) $(INIT)asm/fpemu.asm ./fpemu.o
#	ar cr INIT.lib *.o
#	rm -f *.o

	$(CC) -I $(KERN_INCLUDE) -std=c99 $(KERNEL)*.c
	$(CC) -I $(KERN_INCLUDE) $(KERNEL)asm/*.c
#	ar cr KERNEL.lib *.o
#	rm -f *.o

	$(CC) -std=c99 $(LIB)*.c
#	ar cr LIB.lib *.o
#	rm -f *.o

	$(CC) -std=c99 $(TOOLS)*.c
	$(ASM) $(TOOLS)sysout.asm ./sysout.o
#	ar cr TOOLS.lib *.o
#	rm -f *.o

	$(CC) $(VERSION)*.c
#	ar cr VERSION.lib *.o
#	$(CC) tasks.c -L./ -llibos.a

	$(LINK) *.o

#	$(LINK) *.o tasks.o
#	$(LINK) -e SysTask00 *.lib
#	$(LINK) tasks.o
#	$(LINK) tasks.o OSROM.o OSRAM.o tasks.o \
#kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o

#	$(LINK) kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o
#	$(LINK) c032.o setirqs.o keyboard.o timer.o handles.o v86subrs.o fpemu.o
	rm -f *.o
debug:
#	$(CC) -S -std=c99 $(PARAMS) $(SRC_LIB)

clean:
	rm -vf *~
	rm -vf *.s
	rm -vf *.txt
	rm -vf *.map
	rm -vf *.lib
	rm -vf *.o
	rm -vf $(OUTOSNAME)

NoName
() автор топика
Ответ на: комментарий от NoName

fasm не понимает списка имен, я по этому поводу высказывал свое мнение на официальном форуме но тему почему то недавно снесли.

NoName
() автор топика
Ответ на: комментарий от NoName

первый шаг навстречу ответу ты уже сделал.

а теперь все ждут полного вывода команды make и ктомуже такого же красивого

cvv ★★★★★
()
Ответ на: комментарий от NoName

Еще хотелось бы видеть выдачу линковщика - можно не всю, но с самого начала.

По Makefile: как я понимаю, объектники, откомпилированные из исходников в разных каталогах, ложаться в один каталог. Нет ли у тебя файлов с одинаковыми именами, так что объектники затираются?

># $(CC) tasks.c -L./ -llibos.a

Я понимаю, что строка закомментирована, но это неправильная команда: вместо -llibos.a должно быть -los

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Еще хотелось бы видеть выдачу линковщика - можно не всю, но с самого начала.

makefile какбудто содержит вызов линкера.

я думаю что хвост возможно окажется никак не лишним

cvv ★★★★★
()
Ответ на: комментарий от cvv

С такой строчкой в Makefile
	ar cr libos.a *.o
	$(CC) tasks.c -L./ -los
/* --------------------------------------------------- */
Script started on Пнд 24 Июл 2006 14:14:07
gcc -c -O2 -I ./INCLUDE -std=c99 ./OSINIT/*.c

In file included from ./OSINIT/v86func.c:12:

./INCLUDE/compiler.h:27:1: warning: "NULL" redefined

In file included from /usr/include/_G_config.h:14,

                 from /usr/include/libio.h:32,

                 from /usr/include/stdio.h:72,

                 from ./OSINIT/v86func.c:11:

/usr/lib/gcc/i386-redhat-linux/4.1.0/include/stddef.h:403:1: warning: this is the location of the previous definition

gcc -c -O2 -I ./INCLUDE ./OSINIT/asm/*.c

./BIN/fasm ./OSINIT/asm/c032.asm ./c032.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

3 passes, 124511 bytes.

./BIN/fasm ./OSINIT/asm/timer.asm ./timer.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

1 passes, 440 bytes.

./BIN/fasm ./OSINIT/asm/keyboard.asm ./keyboard.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

1 passes, 358 bytes.

./BIN/fasm ./OSINIT/asm/handles.asm ./handles.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

3 passes, 12319 bytes.

./BIN/fasm ./OSINIT/asm/setirqs.asm ./setirqs.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

1 passes, 352 bytes.

./BIN/fasm ./OSINIT/asm/v86subrs.asm ./v86subrs.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

2 passes, 563 bytes.

./BIN/fasm ./OSINIT/asm/fpemu.asm ./fpemu.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

3 passes, 1484 bytes.

gcc -c -O2 -I ./INCLUDE -I ./Kern44/INCLUDE -std=c99 ./Kern44/*.c

gcc -c -O2 -I ./INCLUDE -I ./Kern44/INCLUDE ./Kern44/asm/*.c

gcc -c -O2 -I ./INCLUDE -std=c99 ./LIB/*.c

gcc -c -O2 -I ./INCLUDE -std=c99 ./TOOLS/*.c

./BIN/fasm ./TOOLS/sysout.asm ./sysout.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

2 passes, 939 bytes.

gcc -c -O2 -I ./INCLUDE ./VERSION/*.c

./VERSION/OSROM.c:87: warning: initialization from incompatible pointer type

ar cr libos.a *.o

gcc -c -O2 -I ./INCLUDE tasks.c -L./ -los

In file included from tasks.c:16:

./INCLUDE/compiler.h:27:1: warning: "NULL" redefined

In file included from /usr/include/string.h:33,

                 from tasks.c:13:

/usr/lib/gcc/i386-redhat-linux/4.1.0/include/stddef.h:403:1: warning: this is the location of the previous definition

gcc: -los: linker input file unused because linking not done

rm -f *.o


Script done on Пнд 24 Июл 2006 14:14:09

Сейчас еще дам другой вариант

NoName
() автор топика
Ответ на: комментарий от NoName

>gcc -c -O2 -I ./INCLUDE tasks.c -L./ -los

а маны кто будет читать??

>gcc: -los: linker input file unused because linking not done

ну тебе же сказали чистым англицким сказали что никто не будет ничего линковать ибо незатребовано.

cvv ★★★★★
()
Ответ на: комментарий от NoName

> с чего ты взял что незатребовано.

:/ gcc так сказал - мы ему больше верим. А не затребовано, потому что указан флаг -c, при котором линковка не делается.

tailgunner ★★★★★
()
Ответ на: комментарий от cvv

в смысле я уверен что тебе тербуется прилинковать нечто кроме *.o

cvv ★★★★★
()
Ответ на: комментарий от tailgunner

$ nm sysout.o
         U _SysComObjOffset
0000009f T _SysGetDsSel
000000a5 T _SysGetEsSel
000000ab T _SysGetFsSel
000000b1 T _SysGetGsSel
000000b7 T _SysGetTssSel
00000043 T _SysLookSeg
000000be T _SysLookTss
00000000 T _SysOutLine
00000120 T _SysReadDWord

NoName
() автор топика
Ответ на: комментарий от cvv

>есть такая команда nm

>запость ка сюда её вывод для каждого твоего обьектника

Или вывеси tar.bz2 со всеми объектниками (если он < 1М)

tailgunner ★★★★★
()
Ответ на: комментарий от NoName

А он может оказаться меньше, чем объем данных, которыми мы обменяемся, выясняя всё это через форум :) Может и не оказаться, конечно.

Попробуй линковать, указывая не *.o, а список имен файлов. Попробуй их упорядочить. Если количесвто ошибок уменьшится, ты на верном пути. Почитай man насчет опции "-(".

tailgunner ★★★★★
()
Ответ на: комментарий от NoName

>смысл? Итак видно что есть функции на которые ругается вроде SysOutLine

ну и где видно что у тебя есть ф-я 'SysOutLine'?

повнимательней посмотри.

посмотрел? ещё раз посмотри.

нету её у тебя посему и ругаемся

cvv ★★★★★
()
Ответ на: комментарий от cvv

я сейчас тоже сам догадался что это очень веселая штука разные ОС разные программы и идеология :) Подчеркивание в асме для borland c :)

NoName
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.