Jump to content

    
Sign in to follow this  
Bulya

Сборка arm-elf- toolchain

Recommended Posts

Здравствуйте.

Собираю

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:

#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.

Подскажите, пожалуйста, решение проблемы (правильную конфигурацию при сборке или правильный синтаксис системных вызовов).

Share this post


Link to post
Share on other sites

неделю назад был тот же трабл. я просто ручками сделал как правильно - вынес имя системного вызова в виде непосредственно ланных как требует команда svc.

сегодня грохнул linux-syscalls0.S и обновился cvs.

собралось без матугания на тумб ветку.

 

сильно релиз поскорей выложить хотели. обновите дерево исходников и будет счастье.

Edited by Doka
бездумное цитирование

Share this post


Link to post
Share on other sites
сегодня грохнул linux-syscalls0.S и обновился cvs.

собралось без матугания на тумб ветку.

Спасибо.

Действительно, четыре дня назад в CVS http://sources.redhat.com/newlib/ появилась ревизия libgloss/arm/linux-syscalls0.S, в которой выбросили весь код для __thumb__.

Пропатченная библиотека собралась.

Share this post


Link to post
Share on other sites

а о каком 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 )

Share this post


Link to post
Share on other sites

http://ru.wikipedia.org/wiki/CVS

читать до конца

 

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

 

также читать по теме SVN,GIT,Mercurial

Share this post


Link to post
Share on other sites
http://ru.wikipedia.org/wiki/CVS

читать до конца

 

LOL..

 

версия 1.17.0 согласно ftp RedHat выпущена 22.12.2008

если в системе контроля ревизий не работает автоинкремент этих самых ревизий - это уже не система контроля ревизий..

как может текущий срез называться номеров уже выпущеной (freeze) ревизии?

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

ну не знаю... у меня почему-то версия 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)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this