gcc+ld
Модератор: Модераторы разделов
-
Kolia
- Сообщения: 59
- ОС: Gentoo
gcc+ld
Помогите пжлста.
Проблема состоит вот в чем: при компиляции (gcc -c) .о файл содержит "левые" имена функций (например вместо aaa там будет шото типа _Z9aaav) и соответственно линкер не может связать два .о файла (по причине отсутствия функций).
Из-за чего проблема и как ее решить???
Проблема состоит вот в чем: при компиляции (gcc -c) .о файл содержит "левые" имена функций (например вместо aaa там будет шото типа _Z9aaav) и соответственно линкер не может связать два .о файла (по причине отсутствия функций).
Из-за чего проблема и как ее решить???
Выровняйте мне /dev/hands :)
-
DieS
- Сообщения: 8
Re: gcc+ld
Kolia писал(а): ↑13.03.2008 22:25Помогите пжлста.
Проблема состоит вот в чем: при компиляции (gcc -c) .о файл содержит "левые" имена функций (например вместо aaa там будет шото типа _Z9aaav) и соответственно линкер не может связать два .о файла (по причине отсутствия функций).
Из-за чего проблема и как ее решить???
на самом деле все так как должно быть
убеждатся здесь http://en.wikipedia.org/wiki/Name_mangling
косяк при линковке определенно где-то в другом месте, но никак не в "неправильной транслаяцыи имен" в gcc
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
Но, я так понимую в .о файле содержутся еще имена функций которые ему нужны но в отсутствуют и ld требует функцию aaa а не _Z...
Выровняйте мне /dev/hands :)
-
dey
- Сообщения: 335
- ОС: OpenSuse 11.1
Re: gcc+ld
Kolia писал(а): ↑13.03.2008 22:25Помогите пжлста.
Проблема состоит вот в чем: при компиляции (gcc -c) .о файл содержит "левые" имена функций (например вместо aaa там будет шото типа _Z9aaav) и соответственно линкер не может связать два .о файла (по причине отсутствия функций).
Из-за чего проблема и как ее решить???
А можно вывод линкера посмотреть , а то со слов не совсем понятна проблема
В сознательных действиях должен присутствовать существенный неалгоритмический компонент.
Roger Penrose,The Emperor's New Mind
Roger Penrose,The Emperor's New Mind
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
Да пожадуста. Мне не жалко
Код: Выделить всё
main.o: In function `irq_timer':
main.cpp:(.text+0x2): undefined reference to `_irq_timer'
main.o: In function `irq_keyboard':
main.cpp:(.text+0xe): undefined reference to `_irq_keyboard'
main.o: In function `init_interrupts()':
main.cpp:(.text+0x618): undefined reference to `irq_timer()'
main.cpp:(.text+0x634): undefined reference to `irq_keyboard()'
boot.o: In function `multiboot_entry':
boot.S:(.text+0x1b): undefined reference to `kernel_main'Выровняйте мне /dev/hands :)
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
kernel_main | _Z11kernel_mainmm
_irq_timer | _Z10_irq_timerv
_irq_keyboard | _Z13_irq_keyboardv
irq_timer() | _Z9irq_timerv
irq_keyboard() | _Z12irq_keyboardv
т.е. все как описано по ссылке. Но линкеру нужнен первый столбец
_irq_timer | _Z10_irq_timerv
_irq_keyboard | _Z13_irq_keyboardv
irq_timer() | _Z9irq_timerv
irq_keyboard() | _Z12irq_keyboardv
т.е. все как описано по ссылке. Но линкеру нужнен первый столбец
Выровняйте мне /dev/hands :)
-
dey
- Сообщения: 335
- ОС: OpenSuse 11.1
Re: gcc+ld
Kolia писал(а): ↑15.03.2008 23:31Да пожадуста. Мне не жалко
Код: Выделить всё
main.o: In function `irq_timer': main.cpp:(.text+0x2): undefined reference to `_irq_timer' main.o: In function `irq_keyboard': main.cpp:(.text+0xe): undefined reference to `_irq_keyboard' main.o: In function `init_interrupts()': main.cpp:(.text+0x618): undefined reference to `irq_timer()' main.cpp:(.text+0x634): undefined reference to `irq_keyboard()' boot.o: In function `multiboot_entry': boot.S:(.text+0x1b): undefined reference to `kernel_main'
Такое сообщение характерно, когда при линковке не указаны соотвествующие библиотеки. Это на вскидку , т.к. опции компоновки при сборке проекта и ваш код не видел
В сознательных действиях должен присутствовать существенный неалгоритмический компонент.
Roger Penrose,The Emperor's New Mind
Roger Penrose,The Emperor's New Mind
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
библиотеки не указаны в силу их отсутствия
опции -
gcc -c
ld -Ttext 0x100000
в коде нет ничего примечательного, кроме того, шо функции _irq_* появляются с помощью define
опции -
gcc -c
ld -Ttext 0x100000
Код: Выделить всё
gcc -c main.cpp
gcc -c boot.S
ld -Ttext 0x100000 -o kernel main.o boot.o)в коде нет ничего примечательного, кроме того, шо функции _irq_* появляются с помощью define
Код: Выделить всё
#define IRQ_HANDLER(func) void func (void);\
asm(#func ": pusha \n call _"#func" \n movb $0x20, %al \n outb %al, $0x20 \n popa \n iret \n");\
void _ ## func(void)Выровняйте мне /dev/hands :)
-
ssh
- Сообщения: 78
- ОС: Debian
Re: gcc+ld
Попробуйте линковать так: g++ -O2 main.cpp boot.cpp
(расширения имен лучше использовать стандартные, иначе линковщик не находит нужных по умолчанию библиотек, по той же причине для программ на с++ надо использовать g++, а не gcc; ключ O2 разрешает расширение inline-функций без обращения к внешним библиотекам). И еще хорошо ваши функции явно объявить inline (правда, сам я не знаю, как это сделать для ассемблерных вставок).
(расширения имен лучше использовать стандартные, иначе линковщик не находит нужных по умолчанию библиотек, по той же причине для программ на с++ надо использовать g++, а не gcc; ключ O2 разрешает расширение inline-функций без обращения к внешним библиотекам). И еще хорошо ваши функции явно объявить inline (правда, сам я не знаю, как это сделать для ассемблерных вставок).
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: gcc+ld
Правила для С++ функций отличаются от правил для С функций (из за перегрузки). Объявляйте нужные функции с префиксом extern ( С )
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
Попробуйте линковать так: g++ -O2 main.cpp boot.cpp
Результат тот-же:
Код: Выделить всё
/tmp/cciILazB.o: In function `_start':
boot.S:(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/../../../crt1.o:init.c:(.text+0x0): first defined here
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/../../../crt1.o: In function `_start':
init.c:(.text+0x18): undefined reference to `main'
/tmp/cciILazB.o: In function `multiboot_entry':
boot.S:(.text+0x1b): undefined reference to `kernel_main'
/tmp/cc8kNPjS.o: In function `irq_timer':
main.cpp:(.text+0x2): undefined reference to `_irq_timer'
/tmp/cc8kNPjS.o: In function `irq_keyboard':
main.cpp:(.text+0xe): undefined reference to `_irq_keyboard'
/tmp/cc8kNPjS.o: In function `init_interrupts()':
main.cpp:(.text+0x500): undefined reference to `irq_timer()'
main.cpp:(.text+0x51e): undefined reference to `irq_keyboard()'
collect2: ld returned 1 exit statusВыровняйте мне /dev/hands :)
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
Кстати, программа находится в нескольких файлах (~10), включаются в главный #include "xxx.cpp". При запихивании всей программы в один файл все компилируется нормально.
Выровняйте мне /dev/hands :)
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: gcc+ld
Охо, да вы извращенец.
#include надо делать заголовочных файлов, а не для сорцов.
А ещё:
init.c:(.text+0x18): undefined reference to `main'
Ничего не забыли?
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
По-моему это лучше, чем тогда когда проект розрастется до нескольких десятков тысяч строк кода думать шо и куда пихать.
Не.
Проект будет (возможно, когда-нибудь) ОС.
В main.cpp есть функция kernel_main, на которую есть обращения из boot.S
Понял причину проблемы. Я думаю что:
Трансляция имен применима токо для компиляции C++ программ. boot.S в котором содержится функция kernel_main написан на ассемблере поэтому она не приняла вид _Z... , которая искал ld.
Остальные функции, которые ld не находил получены с помощью define, ну и наверно это как-то повлияло на компиляцию (в main.o все фуннции имели вид _Z... кроме _irq*). Кода я запихнул все в один файл я убрал define и написал все вручную.
Выровняйте мне /dev/hands :)
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
Я так понимаю, шо заголовки всех доступных "извне" функций и переменных нужно записать в затоловочный файл и включить #include "xxx.h" в xxx.cpp. После этого xxx.cpp нужно компилировать?
Выровняйте мне /dev/hands :)
-
halturin
- Сообщения: 167
- ОС: Linux
Re: gcc+ld
сори, но глядя на эти неуверенные первые шаги в программировании я слабо верю что ты хотя бы до загрузчика дойдешь
Думаю для начала стоило бы поучиться на более простых вещах, почитать докуметацию, посмотреть примеры, понять как работает компилятор и как работает линковщик. Я серьезно. Когда начинаешь с малого и понятного, девелопинг становится куда интересней, потому как ты будешь видеть рабочие результаты, а не пыхтеть над 3-мя файлами две недели и не понимать, почему оно не собирается.
Хотя быть может я ошибаюсь, каждый по своему самообучается
-
halturin
- Сообщения: 167
- ОС: Linux
Re: gcc+ld
Слушай, возьми какой-нибудь опенсорсный проект, посмотри как там делают. Ведь множество проектов содержит в себе свыше сотни файлов. Разбивать нужно не "чтобы было", а для придания структурности твоему проекту.
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
Они эти сотни файлов сначал компилируют, а потом линкуют, а я хотел бы с помощью #include.
Ну это я догадался
Выровняйте мне /dev/hands :)
-
Kolia
- Сообщения: 59
- ОС: Gentoo
Re: gcc+ld
halturin писал(а): ↑31.03.2008 09:06
сори, но глядя на эти неуверенные первые шаги в программировании я слабо верю что ты хотя бы до загрузчика дойдешь![]()
Думаю для начала стоило бы поучиться на более простых вещах, почитать докуметацию, посмотреть примеры, понять как работает компилятор и как работает линковщик. Я серьезно. Когда начинаешь с малого и понятного, девелопинг становится куда интересней, потому как ты будешь видеть рабочие результаты, а не пыхтеть над 3-мя файлами две недели и не понимать, почему оно не собирается.
Хотя быть может я ошибаюсь, каждый по своему самообучается
Эт далеко не первые шаги в программировании(. Просто решил распределить по нескольким файлам и появились проблемы (+ещё часть написана на ассемблере). Загрузчик - GRUB, так шо этап загрузчика давно прошел
Выровняйте мне /dev/hands :)