реклама на сайте
подробности

 
 
> Сборка arm-elf- toolchain, Не удается собрать newlib
Bulya
сообщение Oct 28 2009, 12:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 11-10-08
Из: Харьков
Пользователь №: 40 874



Здравствуйте.
Собираю
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.
Подскажите, пожалуйста, решение проблемы (правильную конфигурацию при сборке или правильный синтаксис системных вызовов).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
klen
сообщение Oct 30 2009, 08:06
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



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

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

Сообщение отредактировал Doka - Nov 14 2009, 07:14
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Bulya
сообщение Oct 30 2009, 15:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 11-10-08
Из: Харьков
Пользователь №: 40 874



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

Спасибо.
Действительно, четыре дня назад в CVS http://sources.redhat.com/newlib/ появилась ревизия libgloss/arm/linux-syscalls0.S, в которой выбросили весь код для __thumb__.
Пропатченная библиотека собралась.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 06:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016