Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сборка arm-elf- toolchain
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Bulya
Здравствуйте.
Собираю
binutils-2.20, gcc-4.3.4, newlib-1.17.0
с ключами
--target=arm-elf --enable-interwork --enable-multilib --enable-languages="c,c++" --with-gnu-as --with-gnu-ld
--disable-shared --disable-nls --disable-newlib-supplied-syscalls --disable-newlib-io-float

компиляция newlib прекращается с ошибками в linux-syscalls0.S
.../newlib-1.17.0/libgloss/arm/linux-syscalls0.S:37: Error: missing expression -- `swi'
.../newlib-1.17.0/libgloss/arm/linux-syscalls0.S:102: Error: missing expression -- `swi'
...

linux-syscalls0.S:
CODE

#include "linux-syscall.h"

#if __thumb__
# define FUNC(name) .type name, %function; .thumb_func; name:
# define SET .thumb_set
#else
# define FUNC(name) .type name, %function; name:
# define SET .set
#endif

#define GLOBAL(name) .global name; FUNC(name)
#define SIZE(name) .size name, .-name

#if __thumb__

# define SYSCALL0(name) \
GLOBAL(_ ## name); \
mov r12, r7; \
mov r7, #SYS_ ## name; \
swi; \
mov r7, r12; \
b _set_errno; \
SIZE(_ ## name)

/* static int _syscall3(int a, int b, int c, int number); */
FUNC(_syscall3)
push { r7 }
mov r7, r3
swi
pop { r7 }
b _set_errno
SIZE(_syscall3)

# define SYSCALL3(name) \
GLOBAL(_ ## name); \
mov r3, #SYS_ ## name; \
b _syscall3; \
SIZE(_ ## name)

# define SYSCALL6(name) \
GLOBAL(_ ## name); \
push { r4 - r5, r7 }; \
ldr r4, [sp, #12]; \
ldr r5, [sp, #16]; \
mov r7, #SYS_ ## name; \
swi; \
pop { r4 - r5, r7 }; \
b _set_errno; \
SIZE(_ ## name)

# define SYSCALL4(name) SYSCALL6(name)

#else /* __thumb__ */

# define SYSCALL4(name) \
GLOBAL(_ ## name); \
swi #SYS_ ## name; \
b _set_errno; \
SIZE(_ ## name)

# define SYSCALL6(name) \
GLOBAL(_ ## name); \
push { r4 - r5 }; \
ldr r4, [sp, #8]; \
ldr r5, [sp, #12]; \
swi #SYS_ ## name; \
pop { r4 - r5 }; \
b _set_errno; \
SIZE(_ ## name)

#define SYSCALL0(name) SYSCALL3(name)
#define SYSCALL3(name) SYSCALL4(name)

#endif /* __thumb__ */

#define SYSCALL1(name) SYSCALL3(name)
#define SYSCALL2(name) SYSCALL3(name)
#define SYSCALL5(name) SYSCALL6(name)

SYSCALL1(alarm)
SYSCALL1(brk)
SYSCALL1(chdir)
SYSCALL2(chmod)
SYSCALL3(chown)
SYSCALL1(close)
SYSCALL1(dup)
SYSCALL2(dup2)
SYSCALL3(execve)
SYSCALL1(exit)
SYSCALL3(fcntl)
SYSCALL2(fstat)
SYSCALL2(ftruncate)
SYSCALL3(getdents)
SYSCALL0(getegid)
SYSCALL0(geteuid)
SYSCALL0(getgid)
SYSCALL2(getgroups)
SYSCALL1(getpgid)
SYSCALL0(getpgrp)
SYSCALL0(getpid)
SYSCALL0(getuid)
SYSCALL2(gettimeofday)
SYSCALL3(ioctl)
SYSCALL2(kill)
SYSCALL3(lchown)
SYSCALL2(link)
SYSCALL3(lseek)
SYSCALL2(lstat)
SYSCALL2(mkdir)
SYSCALL3(mknod)
SYSCALL2(nanosleep)
SYSCALL3(open)
SYSCALL0(pause)
SYSCALL1(pipe)
SYSCALL3(read)
SYSCALL3(readlink)
SYSCALL4(reboot)
SYSCALL1(rmdir)
SYSCALL5(select)
SYSCALL2(setpgid)
SYSCALL1(setgid)
SYSCALL0(setsid)
SYSCALL1(setuid)
SYSCALL3(sigprocmask)
SYSCALL2(socketcall)
SYSCALL2(stat)
SYSCALL1(stime)
SYSCALL2(symlink)
SYSCALL1(sync)
SYSCALL1(sysinfo)
SYSCALL1(times)
SYSCALL2(truncate)
SYSCALL1(umask)
SYSCALL1(uname)
SYSCALL1(unlink)
SYSCALL2(utime)
SYSCALL0(vfork)
SYSCALL4(wait4)
SYSCALL3(write)

т.е. передача номера прерывания через регистр r7 (в __thumb__), а не в инструкции swi вызывает ошибку.

Что характерно, системные вызовы linux мне вообще не нужны для arm-elf.
Подскажите, пожалуйста, решение проблемы (правильную конфигурацию при сборке или правильный синтаксис системных вызовов).
klen
неделю назад был тот же трабл. я просто ручками сделал как правильно - вынес имя системного вызова в виде непосредственно ланных как требует команда svc.
сегодня грохнул linux-syscalls0.S и обновился cvs.
собралось без матугания на тумб ветку.

сильно релиз поскорей выложить хотели. обновите дерево исходников и будет счастье.
Bulya
Цитата(klen @ Oct 30 2009, 10:06) *
сегодня грохнул linux-syscalls0.S и обновился cvs.
собралось без матугания на тумб ветку.

Спасибо.
Действительно, четыре дня назад в CVS http://sources.redhat.com/newlib/ появилась ревизия libgloss/arm/linux-syscalls0.S, в которой выбросили весь код для __thumb__.
Пропатченная библиотека собралась.
Doka
а о каком CVS newlib речь??.. я брал отсюда ftp://sources.redhat.com/pub/newlib/
версия newlib-1.17.0.tar.gz датирована 22.12.2008 (собирал с правкой configure.ac как описано на http://eluaproject.dreamhosters.com/en/Bui..._GCC_for_Cortex )
klen
http://ru.wikipedia.org/wiki/CVS
читать до конца

ставить CVS клиета, забирать им текщий срез дерева исходников, править и закладывать сои измения в дерево(для продвинутых smile.gif)

также читать по теме SVN,GIT,Mercurial
Doka
Цитата(klen @ Nov 14 2009, 13:55) *
http://ru.wikipedia.org/wiki/CVS
читать до конца


LOL..

версия 1.17.0 согласно ftp RedHat выпущена 22.12.2008
если в системе контроля ревизий не работает автоинкремент этих самых ревизий - это уже не система контроля ревизий..
как может текущий срез называться номеров уже выпущеной (freeze) ревизии?
klen
Цитата(Doka @ Nov 14 2009, 15:37) *
LOL..

версия 1.17.0 согласно ftp RedHat выпущена 22.12.2008
если в системе контроля ревизий не работает автоинкремент этих самых ревизий - это уже не система контроля ревизий..
как может текущий срез называться номеров уже выпущеной (freeze) ревизии?


уважаемый, Вы не до конца дочитали.

1.17.0 - это всего лишь релиз, конкретный срез который приняли как "релизный".

чтоб получить самые свежее состояние дерева исходников в Вашем случае нужно в консоли жмякнуть
cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/src co newlib

и потом перед сборкой при желании обновить дерево в тойже консоли с темже текущим путем жмякнуть
cvs update
Doka
ну не знаю... у меня почему-то версия newlib-1.17.0 под ARM собирается..
(./configure --target=$TARGET --prefix=$PREFIX --enable-interwork --disable-newlib-supplied-syscalls --with-gnu-ld --with-gnu-as --disable-shared || exit)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.