Port-arm archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: [PATCH] thumb fixes



On Mon, Sep 08, 2008 at 01:36:42PM +0300, Mikko Rapeli wrote:
> NetBSD comes with binutils 2.16.1 and some fixes so switching to
> 2.18.50 solves this thumb issues. The whole tree does not compile with
> ld and others from binutils-2.18.50 but enough to run thumb mode /bin/sh 
> and /bin/cat work with thumb mode /lib/libc.so and others. Though
> /libexec/ld.elf_so still needs to be in ARM mode.

I had forgotten the -mlong-calls workaround on in my build script, but
newer binutils fixes this issues also without it. Here's the latest build 
script for thumb mode userspace:

#!/bin/sh -x

# Used to build NetBSD userspace to thumb

# recuirements:
# netbsd-current source tree
# with binutils 2.18.50 (or with some ARM/thumb fixes)
# and a patch http://mail-index.netbsd.org/port-arm/2008/08/20/msg000342.html

# usage instructions for building a thumb userspace:
# cd netbsd_source_dir
# ./build.sh -U -O obj -j 3 -m evbarm tools && ./thumb.sh 

#TOOLDIR=obj/tooldir.Linux-2.6.24-etchnhalf.1-686-unknown
TOOLDIR=obj/tooldir.$(uname -s)-$(uname -r)-$(uname -i)

./build.sh -j 3 -U -O obj -m evbarm makewrapper || exit -1

echo thumb.sh clean objects

$TOOLDIR/bin/nbmake-evbarm cleandir

echo thumb.sh prepare to build ARM mode libc and linker

CPUFLAGS=-mthumb-interwork $TOOLDIR/bin/nbmake-evbarm obj || exit -1
CPUFLAGS=-mthumb-interwork $TOOLDIR/bin/nbmake-evbarm do-distrib-dirs || exit -1
CPUFLAGS=-mthumb-interwork $TOOLDIR/bin/nbmake-evbarm includes || exit -1
CPUFLAGS=-mthumb-interwork $TOOLDIR/bin/nbmake-evbarm do-lib-csu || exit -1
CPUFLAGS=-mthumb-interwork $TOOLDIR/bin/nbmake-evbarm do-libgcc || exit -1

echo thumb.sh build ARM mode libc for linker

CPUFLAGS=-mthumb-interwork $TOOLDIR/bin/nbmake-evbarm do-lib-libc || exit -1

echo thumb.sh build ARM mode linker linked statically with ARM mode libc, since
echo thumb.sh thumb mode does not work

CPUFLAGS=-mthumb-interwork $TOOLDIR/bin/nbmake-evbarm do-ld.so || exit -1

echo thumb.sh clean destdir and backup ARM mode /libexec/ld.elf_so

rm -rf obj/destdir.evbarm || exit -1
mv obj/libexec obj/libexec-arm || exit -1

echo thumb.sh start sub-shell for thumb compilation

(

# don't halt on linker warnings (libcrypto's patent warnings)
#export NOGCCERROR=yes

# binutils 2.18.50 brings build issues with GCC, ld, etc
export MKGCCCMDS=no 
export MKGZBOOT=no
export MKBFD=no

export SAFE_CPUFLAGS="-mthumb-interwork"

# contain asm
CSU_FAILING_OBJECTS="crt0 crti crtn gcrt0"

# These cause runtime failures if build in thumb mode
CSU_RUNTIME_FAILING_OBJECTS="crtbegin crtbeginT crtend crtbeginS crtendS"

for i in $CSU_FAILING_OBJECTS $CSU_RUNTIME_FAILING_OBJECTS
do
  eval `echo export CPUFLAGS_$i=\"$SAFE_CPUFLAGS\"`
done

# gcrt0 target in lib/csu/common_elf has a manual build command and
# an empty .IMPSRC make variable. Working around this by using CPUFLAGS_ 
# variable which defaults safely:
export CPUFLAGS_="$SAFE_CPUFLAGS"

# To get this list: build libc with CPUFLAGS=-mthumb and MAKEFLAGS=-k to 
# gather failing object to log 
# then run:
# grep '^*** Failed tar.*.[so,o] log' | awk -e '{ print $4 }'|  sed -e 
's/\.so//' | sed -e 's/\.o//' | sort | uniq | xargs > thumb_failing_objects.txt 

LIBC_FAILING_OBJECTS='accept access acct tmp_adjtime aio_suspend alloca 
atomic_cas_up atomic_init_testset bcopy bind brk byte_swap_2 byte_swap_4 bzero 
cerror chdir chflags chmod chown chroot clk_test_force_onoff clk_test_getstatus 
clock_getres clock_gettime tmp_clock_settime tmp_clone close compat_msgctl 
compat_Ovfork compat___semctl compat_setjmp compat_shmctl compat_sigaction 
compat_sigpending compat_sigprocmask compat_sigreturn compat___sigreturn14 
compat_sigsetjmp compat_sigsuspend compat___sigtramp1 connect divsi3 dup dup2 
exect execve _exit extattrctl extattr_delete_fd extattr_delete_file 
extattr_delete_link extattr_get_fd extattr_get_file extattr_get_link 
extattr_list_fd extattr_list_file extattr_list_link extattr_set_fd 
extattr_set_file extattr_set_link fchdir fchflags fchmod fchown fchroot fcntl 
fdatasync ffs tmp_fhopen40 tmp_fhstat40 tmp_fhstatvfs140 fktrace flock fork 
fpathconf tmp_fstat30 fstatvfs1 fsync fsync_range tmp_ftruncate futimes 
getcontext tmp_getcwd tmp_getdents30 getegid geteuid tmp_getfh30 getgid 
getgroups getitimer tmp_getlogin getpeername getpgid getpgrp getpid getppid 
getpriority getrlimit getrusage getsid getsockname getsockopt gettimeofday 
getuid getvfsstat ioctl issetugid kevent kill kqueue _ksem_close _ksem_destroy 
_ksem_getvalue _ksem_init _ksem_open _ksem_post _ksem_trywait _ksem_unlink 
_ksem_wait ktrace lchflags lchmod lchown lfs_bmapv lfs_markv lfs_segclean 
lfs_segwait link listen tmp_lseek tmp_lstat30 lutimes _lwp_continue _lwp_create 
_lwp_ctl _lwp_detach _lwp_exit _lwp_getname _lwp_getprivate _lwp_kill _lwp_park 
_lwp_self _lwp_setname _lwp_setprivate _lwp_suspend _lwp_unpark _lwp_unpark_all 
_lwp_wait _lwp_wakeup madvise mcount memcmp memcpy memmove memset mincore 
minherit mkdir mkfifo mknod mlock mlockall tmp_mmap modctl tmp_mount50 mprotect 
mq_receive mq_send mq_timedreceive mq_timedsend mremap tmp_msgctl13 msgget 
msgrcv msgsnd tmp_msync13 munlock munlockall munmap nanosleep nfssvc 
tmp_ntp_adjtime tmp_ntp_gettime30 open pathconf pipe pmc_control pmc_get_info 
poll pollts tmp_posix_chown tmp_posix_fadvise50 tmp_posix_fchown 
tmp_posix_lchown tmp_posix_rename tmp_pread tmp_preadv profil pselect ptrace 
tmp_pwrite tmp_pwritev quotactl rasctl read readlink readv reboot recvfrom 
recvmsg rename revoke rmdir sa_enable sa_preempt sa_register sa_setconcurrency 
sa_stacks sa_yield sbrk _sched_getaffinity _sched_getparam _sched_setaffinity 
_sched_setparam sched_yield select semconfig tmp___semctl13 semget semop 
sendmsg sendto setcontext setegid seteuid setgid setgroups setitimer setjmp 
_setjmp tmp_setlogin setpgid setpriority setregid setreuid setrlimit setsid 
setsockopt tmp_settimeofday setuid shmat tmp_shmctl13 shmdt shmget shutdown 
tmp_sigaction_sigtramp tmp_sigaltstack14 tmp_sigpending14 tmp_sigprocmask14 
sigsetjmp tmp_sigsuspend14 tmp_sigtimedwait __sigtramp2 tmp_socket30 socketpair 
tmp_stat30 statvfs1 strcmp strncmp swapcontext swapctl symlink sync sysarch 
syscall __syscall tmp_sysctl timer_create timer_delete timer_getoverrun 
timer_gettime timer_settime tmp_truncate umask undelete unlink unmount utimes 
utrace uuidgen vadvise __vfork14 wait4 write writev'

# functions in these object produce runtime errors in thumb mode:
# initfini calls atomic_init in thumb mode but atomic_init_testset 
# only compiles in ARM mode
RUNTIME_ERRORS='atexit initfini'

# compiler bug with c++ code, note 's/-/_/g':
GCCBUG="application exceptions atffile config formats ui fs tests ext_inst 
fstream_inst fstream_inst ios_inst istream_inst istream locale_inst localename 
ostream_inst sstream_inst string_inst strstream valarray_inst wstring_inst 
wlocale_inst eh_personality vec text" 

# Contains inline ARM asm and do not compile to thumb. Note: there are many
# lock.o's but there is no way to distinguish them with this build hack.
ASM="k_tanf _context_u pthread_lock _pset_bind aio_cancel aio_error aio_fsync 
aio_read aio_return aio_write lio_listio mq_close mq_getattr aio_cancel 
aio_error aio_fsync aio_return aio_write lio_listio mq_close mq_getattr 
mq_notify mq_open mq_setattr mq_unlink pset_assign pset_create pset_destroy 
srtbegin abortfixup stackptr lock "

NEW_ASM='__syscall __clone __clone __fhopen40 __fhstatvfs140 __fhstat40 
__fstat30 __getcwd __getdents30 __getfh30 __getlogin __lstat30 __mount50 
__msgctl13 __ntp_gettime30 __posix_chown __posix_fadvise50 __posix_fchown 
__posix_lchown __posix_rename ____semctl13 __setlogin __shmctl13 
__sigaltstack14 __sigtimedwait __sigpending14 __sigaction_sigtramp __socket30 
__stat30 __sysctl tmp__lwp_getprivate tmp_mremap __msync13 __sigsuspend14 
__sigprocmask14 __clone __fhopen40 __fhstat40 __fhstatvfs140 __fstat30 __getcwd 
__getdents30 __getfh30 __getlogin __lstat30 __mount50 __msgctl13 
__ntp_gettime30 __posix_chown __posix_fadvise50 __posix_fchown __posix_lchown 
__posix_rename ____semctl13 __setlogin __shmctl13 __sigaltstack14 
__sigpending14 __socket30 __sigaction_sigtramp __sigtimedwait __stat30 __sysctl 
tmp__lwp_getprivate tmp_mremap __msync13 __sigsuspend14 __sigprocmask14'

for i in $LIBC_FAILING_OBJECTS $RUNTIME_ERRORS $GCCBUG $ASM $NEW_ASM
do
  eval `echo export CPUFLAGS_$i=\"$SAFE_CPUFLAGS\"`
done

export THUMB_CPUFLAGS="-mthumb $SAFE_CPUFLAGS"
export CPUFLAGS='${CPUFLAGS_${.IMPSRC:S/-/_/g:T:R}:U${THUMB_CPUFLAGS}}' 

echo thumb.sh Building thumb userspace:

./build.sh -U -O obj -j 3 -m evbarm build || exit -1

echo thumb.sh end thumb compilation sub-shell
) || exit -1

echo "thumb.sh now build stuff (except binutils 2.18.50) that fails to compile 
in thumb mode:"

MKBFD=no CPUFLAGS=-mthumb-interwork ./build.sh -U -u -O obj -j 3 -m evbarm 
build || exit -1

echo thumb.sh install ARM mode /libexec/ld.elf_so from backup
cp -f obj/libexec-arm/ld.elf_so/ld.elf_so obj/destdir.evbarm/libexec/ld.elf_so 
|| exit -1

echo thumb.sh Building distribution

MKBFD=no CPUFLAGS=-mthumb-interwork ./build.sh -U -u -O obj -j 3 -m evbarm 
distribution || exit -1


Home | Main Index | Thread Index | Old Index