svn commit: [25671] branches/uClibc-nptl: docs extra/Configs libc/sysdeps/linux/c etc...

kraj at uclibc.org kraj at uclibc.org
Mon Mar 16 06:52:01 UTC 2009


Author: kraj
Date: 2009-03-16 06:52:00 +0000 (Mon, 16 Mar 2009)
New Revision: 25671

Log:
Merged revisions 25638,25640,25642,25649-25650,25667-25668 via svnmerge from 
svn+ssh://svn.uclibc.org/svn/trunk/uClibc

........
  r25638 | vda | 2009-03-12 13:56:59 -0700 (Thu, 12 Mar 2009) | 10 lines
  
  linuxthreads fixes from Will Newton (will.newton AT gmail.com):
  * share Sys V semaphores in order to get appropriate SEM_UNDO semantics.
  * correct guardaddr in pthread_free() for TLS case
  * move spinlock unlocking before restart()
  * When exit was called from a signal handler, the restart
    from the manager processing the exit request instead restarted the thread
    in pthread_cond_timedwait.
    (see http://sources.redhat.com/ml/libc-ports/2006-05/msg00000.html)
........
  r25640 | vda | 2009-03-12 16:04:19 -0700 (Thu, 12 Mar 2009) | 3 lines
  
  add linuxthreads support for arm. By Will Newton (will.newton AT gmail.com)
........
  r25642 | vapier | 2009-03-12 23:17:48 -0700 (Thu, 12 Mar 2009) | 1 line
  
  add GNU extension for select timeouts where the sub-second field is actually longer than one second
........
  r25649 | vapier | 2009-03-14 04:23:28 -0700 (Sat, 14 Mar 2009) | 1 line
  
  force DOPIC for FDPIC ELF targets
........
  r25650 | vapier | 2009-03-14 04:30:56 -0700 (Sat, 14 Mar 2009) | 1 line
  
  default linux-2.4 module support to off for Blackfin targets
........
  r25667 | vda | 2009-03-15 19:56:27 -0700 (Sun, 15 Mar 2009) | 3 lines
  
  docs/pthreads_hacking.txt: new file
........
  r25668 | kraj | 2009-03-15 23:02:47 -0700 (Sun, 15 Mar 2009) | 2 lines
  
  Update copyright header.
........


Added:
   branches/uClibc-nptl/docs/pthreads_hacking.txt

Modified:
   branches/uClibc-nptl/
   branches/uClibc-nptl/extra/Configs/Config.in
   branches/uClibc-nptl/extra/Configs/Config.in.arch
   branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c
   branches/uClibc-nptl/libc/sysdeps/linux/common/select.c


Changeset:

Property changes on: branches/uClibc-nptl
___________________________________________________________________
Modified: svnmerge-integrated
   - /trunk/uClibc:1-25623
   + /trunk/uClibc:1-25668

Copied: branches/uClibc-nptl/docs/pthreads_hacking.txt (from rev 25668, trunk/uClibc/docs/pthreads_hacking.txt)
===================================================================
--- branches/uClibc-nptl/docs/pthreads_hacking.txt	                        (rev 0)
+++ branches/uClibc-nptl/docs/pthreads_hacking.txt	2009-03-16 06:52:00 UTC (rev 25671)
@@ -0,0 +1,748 @@
+# Run me as a shell script in uclibc lib/*
+
+
+# Dump the list of dynamic symbols from libpthread
+# and compare libpthread's exported symbols of uclibc with glibc
+# (adjust /lib64/libpthread-*.*.so as needed).
+# The resulting diff is suspiciously large.
+# We export a lot of stuff which glibc does not.
+
+readelf -sDW libpthread-*.*.so \
+| grep '^ *[0-9]' \
+| sed 's/^[0-9a-f: ]*[^ ]\(  *[A-Z]\)/\1/' \
+| sed 's/ [0-9] / N /' | sed 's/ [0-9][0-9] /  N /' | sed 's/ [0-9][0-9][0-9] /   N /' \
+| sort -k5 | uniq \
+>uclibc.lst
+
+readelf -sDW /lib64/libpthread-*.*.so \
+| grep '^ *[0-9]' \
+| sed 's/^[0-9a-f: ]*[^ ]\(  *[A-Z]\)/\1/' \
+| sed 's/ [0-9] / N /' | sed 's/ [0-9][0-9] /  N /' | sed 's/ [0-9][0-9][0-9] /   N /' \
+| sort -k5 | uniq \
+>glibc.lst
+diff -u uclibc.lst glibc.lst >ug.diff
+
+
+# Check which exported symbols from libpthread are never referenced
+# from other libraries. Generally, I'd expect a very few __functions
+# with two underscores to be exported and not used by e.g. libc-X.X.X.so,
+# as these names are supposed to be internal, i.e. external programs
+# usually don't call them. On my system, I got 141 such __functions.
+# Examples:
+# __flockfilelist - NOP function (why do we need it at all?)
+# __pthread_perform_cleanup - called only from within libpthread
+
+echo *-*.*.*.so | xargs -n1 | grep -v libpthread | xargs readelf -aW >full_dump.lst
+>uclibc_unrefd.lst
+>uclibc_refd.lst
+sed 's/^.* //g' uclibc.lst \
+| while read symbol; do
+	if grep -F -- "$symbol" full_dump.lst >/dev/null 2>&1; then
+		echo "$symbol" >>uclibc_refd.lst
+	else
+		echo "$symbol" >>uclibc_unrefd.lst
+	fi
+done
+
+exit
+
+
+In case you don't have a glibc system to try it,
+ug.diff from vda's system is below.
+
+--- uclibc.lst	2009-03-16 03:07:58.000000000 +0100
++++ glibc.lst	2009-03-16 03:07:58.000000000 +0100
+@@ -1,188 +1,173 @@
+-  NOTYPE GLOBAL DEFAULT ABS __bss_start
+-    FUNC GLOBAL DEFAULT   N __compare_and_swap
++  OBJECT GLOBAL DEFAULT ABS GLIBC_2.2.5
++  OBJECT GLOBAL DEFAULT ABS GLIBC_2.2.6
++  OBJECT GLOBAL DEFAULT ABS GLIBC_2.3.2
++  OBJECT GLOBAL DEFAULT ABS GLIBC_2.3.3
++  OBJECT GLOBAL DEFAULT ABS GLIBC_2.3.4
++  OBJECT GLOBAL DEFAULT ABS GLIBC_2.4
++  OBJECT GLOBAL DEFAULT ABS GLIBC_PRIVATE
++    FUNC GLOBAL DEFAULT   N _IO_flockfile
++    FUNC GLOBAL DEFAULT   N _IO_ftrylockfile
++    FUNC GLOBAL DEFAULT   N _IO_funlockfile
++  NOTYPE   WEAK DEFAULT UND _Jv_RegisterClasses
++    FUNC GLOBAL DEFAULT UND __clone
++    FUNC   WEAK DEFAULT   N __close
++    FUNC   WEAK DEFAULT   N __connect
++    FUNC   WEAK DEFAULT UND __cxa_finalize
++    FUNC GLOBAL DEFAULT UND __endmntent
+     FUNC GLOBAL DEFAULT   N __errno_location
+-    FUNC GLOBAL DEFAULT   N __flockfilelist
+-    FUNC GLOBAL DEFAULT   N __fresetlockfiles
+-    FUNC GLOBAL DEFAULT   N __funlockfilelist
++    FUNC   WEAK DEFAULT   N __fcntl
++    FUNC GLOBAL DEFAULT   N __fork
++    FUNC GLOBAL DEFAULT UND __fxstat64
++    FUNC GLOBAL DEFAULT UND __getdelim
++    FUNC GLOBAL DEFAULT UND __getmntent_r
++    FUNC GLOBAL DEFAULT UND __getpagesize
++    FUNC GLOBAL DEFAULT UND __gettimeofday
+     FUNC GLOBAL DEFAULT   N __h_errno_location
+-    FUNC GLOBAL DEFAULT   N __linuxthreads_create_event
+-    FUNC GLOBAL DEFAULT   N __linuxthreads_death_event
+-  OBJECT GLOBAL DEFAULT   N __linuxthreads_initial_report_events
+-  OBJECT GLOBAL DEFAULT   N __linuxthreads_pthread_key_2ndlevel_size
+-  OBJECT GLOBAL DEFAULT   N __linuxthreads_pthread_keys_max
+-  OBJECT GLOBAL DEFAULT   N __linuxthreads_pthread_sizeof_descr
+-  OBJECT GLOBAL DEFAULT   N __linuxthreads_pthread_threads_max
+-    FUNC GLOBAL DEFAULT   N __linuxthreads_reap_event
+-  OBJECT GLOBAL DEFAULT   N __linuxthreads_version
+-    FUNC GLOBAL DEFAULT   N __pthread_alt_lock
+-    FUNC GLOBAL DEFAULT   N __pthread_alt_timedlock
+-    FUNC GLOBAL DEFAULT   N __pthread_alt_unlock
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_destroy
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getdetachstate
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getguardsize
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getinheritsched
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getschedparam
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getschedpolicy
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getscope
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getstack
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_getstacksize
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_init
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setdetachstate
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setguardsize
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setinheritsched
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setschedparam
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setschedpolicy
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setscope
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setstack
+-    FUNC GLOBAL DEFAULT   N __pthread_attr_setstacksize
+-    FUNC GLOBAL DEFAULT   N __pthread_barrierattr_getpshared
+-    FUNC GLOBAL DEFAULT   N __pthread_compare_and_swap
+-    FUNC GLOBAL DEFAULT   N __pthread_cond_broadcast
+-    FUNC GLOBAL DEFAULT   N __pthread_cond_destroy
+-    FUNC GLOBAL DEFAULT   N __pthread_cond_init
+-    FUNC GLOBAL DEFAULT   N __pthread_cond_signal
+-    FUNC GLOBAL DEFAULT   N __pthread_cond_timedwait
+-    FUNC GLOBAL DEFAULT   N __pthread_cond_wait
+-    FUNC GLOBAL DEFAULT   N __pthread_condattr_destroy
+-    FUNC GLOBAL DEFAULT   N __pthread_condattr_init
+-    FUNC GLOBAL DEFAULT   N __pthread_create
+-    FUNC GLOBAL DEFAULT   N __pthread_destroy_specifics
+-    FUNC GLOBAL DEFAULT   N __pthread_do_exit
+-    FUNC GLOBAL DEFAULT   N __pthread_equal
+-    FUNC GLOBAL DEFAULT   N __pthread_exit
+-  OBJECT GLOBAL DEFAULT   N __pthread_exit_code
+-  OBJECT GLOBAL DEFAULT   N __pthread_exit_requested
+-    FUNC GLOBAL DEFAULT   N __pthread_find_self
+-  OBJECT GLOBAL DEFAULT   N __pthread_functions
+-    FUNC GLOBAL DEFAULT   N __pthread_getconcurrency
+-    FUNC GLOBAL DEFAULT   N __pthread_getschedparam
+-    FUNC   WEAK DEFAULT   N __pthread_getspecific
+-  OBJECT GLOBAL DEFAULT   N __pthread_handles
+-  OBJECT GLOBAL DEFAULT   N __pthread_handles_num
+-  OBJECT GLOBAL DEFAULT   N __pthread_has_cas
+-    FUNC GLOBAL DEFAULT   N __pthread_init_max_stacksize
+-  OBJECT GLOBAL DEFAULT   N __pthread_initial_thread
+-  OBJECT GLOBAL DEFAULT   N __pthread_initial_thread_bos
+-    FUNC GLOBAL DEFAULT   N __pthread_initialize
+-    FUNC GLOBAL DEFAULT   N __pthread_initialize_manager
++    FUNC GLOBAL DEFAULT   N __libc_allocate_rtsig
++    FUNC GLOBAL DEFAULT UND __libc_allocate_rtsig_private
++    FUNC GLOBAL DEFAULT   N __libc_current_sigrtmax
++    FUNC GLOBAL DEFAULT UND __libc_current_sigrtmax_private
++    FUNC GLOBAL DEFAULT   N __libc_current_sigrtmin
++    FUNC GLOBAL DEFAULT UND __libc_current_sigrtmin_private
++    FUNC GLOBAL DEFAULT UND __libc_dl_error_tsd
++    FUNC GLOBAL DEFAULT UND __libc_dlopen_mode
++    FUNC GLOBAL DEFAULT UND __libc_dlsym
++    FUNC GLOBAL DEFAULT UND __libc_fatal
++    FUNC GLOBAL DEFAULT UND __libc_fork
++    FUNC GLOBAL DEFAULT UND __libc_longjmp
++    FUNC GLOBAL DEFAULT UND __libc_pthread_init
++  OBJECT GLOBAL DEFAULT UND __libc_stack_end
++    FUNC GLOBAL DEFAULT UND __libc_system
++    FUNC GLOBAL DEFAULT UND __libc_thread_freeres
++    FUNC   WEAK DEFAULT   N __lseek
++    FUNC   WEAK DEFAULT   N __nanosleep
++    FUNC   WEAK DEFAULT   N __open
++    FUNC   WEAK DEFAULT   N __open64
++    FUNC   WEAK DEFAULT   N __pread64
++    FUNC GLOBAL DEFAULT   N __pthread_cleanup_routine
++    FUNC GLOBAL DEFAULT   N __pthread_clock_gettime
++    FUNC GLOBAL DEFAULT   N __pthread_clock_settime
++    FUNC GLOBAL DEFAULT   N __pthread_getspecific
+     FUNC GLOBAL DEFAULT   N __pthread_initialize_minimal
+-    FUNC GLOBAL DEFAULT   N __pthread_internal_tsd_address
+-    FUNC GLOBAL DEFAULT   N __pthread_internal_tsd_get
+-    FUNC GLOBAL DEFAULT   N __pthread_internal_tsd_set
+-    FUNC   WEAK DEFAULT   N __pthread_key_create
+-    FUNC GLOBAL DEFAULT   N __pthread_kill_other_threads_np
+-  OBJECT GLOBAL DEFAULT   N __pthread_last_event
+-    FUNC GLOBAL DEFAULT   N __pthread_lock
+-  OBJECT GLOBAL DEFAULT   N __pthread_main_thread
+-    FUNC GLOBAL DEFAULT   N __pthread_manager
+-    FUNC GLOBAL DEFAULT   N __pthread_manager_adjust_prio
+-    FUNC GLOBAL DEFAULT   N __pthread_manager_event
+-  OBJECT GLOBAL DEFAULT   N __pthread_manager_reader
+-  OBJECT GLOBAL DEFAULT   N __pthread_manager_request
+-    FUNC GLOBAL DEFAULT   N __pthread_manager_sighandler
+-  OBJECT GLOBAL DEFAULT   N __pthread_manager_thread
+-  OBJECT GLOBAL DEFAULT   N __pthread_manager_thread_bos
+-  OBJECT GLOBAL DEFAULT   N __pthread_manager_thread_tos
+-  OBJECT GLOBAL DEFAULT   N __pthread_max_stacksize
+-    FUNC   WEAK DEFAULT   N __pthread_mutex_destroy
+-    FUNC   WEAK DEFAULT   N __pthread_mutex_init
+-    FUNC   WEAK DEFAULT   N __pthread_mutex_lock
+-    FUNC GLOBAL DEFAULT   N __pthread_mutex_timedlock
+-    FUNC   WEAK DEFAULT   N __pthread_mutex_trylock
+-    FUNC   WEAK DEFAULT   N __pthread_mutex_unlock
+-    FUNC   WEAK DEFAULT   N __pthread_mutexattr_destroy
+-    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_getkind_np
+-    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_getpshared
+-    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_gettype
+-    FUNC   WEAK DEFAULT   N __pthread_mutexattr_init
+-    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_setkind_np
+-    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_setpshared
+-    FUNC   WEAK DEFAULT   N __pthread_mutexattr_settype
+-  OBJECT GLOBAL DEFAULT   N __pthread_nonstandard_stacks
+-    FUNC GLOBAL DEFAULT   N __pthread_null_sighandler
+-  OBJECT GLOBAL DEFAULT   N __pthread_offsetof_descr
+-  OBJECT GLOBAL DEFAULT   N __pthread_offsetof_pid
+-    FUNC   WEAK DEFAULT   N __pthread_once
+-    FUNC GLOBAL DEFAULT   N __pthread_once_fork_child
+-    FUNC GLOBAL DEFAULT   N __pthread_once_fork_parent
+-    FUNC GLOBAL DEFAULT   N __pthread_once_fork_prepare
+-    FUNC GLOBAL DEFAULT   N __pthread_perform_cleanup
+-    FUNC GLOBAL DEFAULT   N __pthread_raise
+-    FUNC GLOBAL DEFAULT   N __pthread_reset_main_thread
+-    FUNC GLOBAL DEFAULT   N __pthread_restart_new
+-    FUNC   WEAK DEFAULT   N __pthread_rwlock_destroy
+-    FUNC   WEAK DEFAULT   N __pthread_rwlock_init
+-    FUNC   WEAK DEFAULT   N __pthread_rwlock_rdlock
+-    FUNC GLOBAL DEFAULT   N __pthread_rwlock_timedrdlock
+-    FUNC GLOBAL DEFAULT   N __pthread_rwlock_timedwrlock
+-    FUNC   WEAK DEFAULT   N __pthread_rwlock_tryrdlock
+-    FUNC   WEAK DEFAULT   N __pthread_rwlock_trywrlock
+-    FUNC   WEAK DEFAULT   N __pthread_rwlock_unlock
+-    FUNC   WEAK DEFAULT   N __pthread_rwlock_wrlock
+-    FUNC GLOBAL DEFAULT   N __pthread_rwlockattr_destroy
+-    FUNC GLOBAL DEFAULT   N __pthread_self
+-    FUNC GLOBAL DEFAULT   N __pthread_setcancelstate
+-    FUNC GLOBAL DEFAULT   N __pthread_setcanceltype
+-    FUNC GLOBAL DEFAULT   N __pthread_setconcurrency
+-    FUNC GLOBAL DEFAULT   N __pthread_setschedparam
+-    FUNC   WEAK DEFAULT   N __pthread_setspecific
+-  OBJECT GLOBAL DEFAULT   N __pthread_sig_cancel
+-  OBJECT GLOBAL DEFAULT   N __pthread_sig_debug
+-  OBJECT GLOBAL DEFAULT   N __pthread_sig_restart
+-    FUNC GLOBAL DEFAULT   N __pthread_sigaction
+-    FUNC GLOBAL DEFAULT   N __pthread_sighandler
+-    FUNC GLOBAL DEFAULT   N __pthread_sighandler_rt
+-    FUNC GLOBAL DEFAULT   N __pthread_sigwait
+-  OBJECT GLOBAL DEFAULT   N __pthread_sizeof_handle
+-  OBJECT GLOBAL DEFAULT   N __pthread_smp_kernel
+-    FUNC GLOBAL DEFAULT   N __pthread_spin_destroy
+-    FUNC GLOBAL DEFAULT   N __pthread_spin_init
+-    FUNC GLOBAL DEFAULT   N __pthread_spin_lock
+-    FUNC GLOBAL DEFAULT   N __pthread_spin_trylock
+-    FUNC GLOBAL DEFAULT   N __pthread_spin_unlock
+-    FUNC GLOBAL DEFAULT   N __pthread_thread_self
+-  OBJECT GLOBAL DEFAULT   N __pthread_threads_debug
+-  OBJECT GLOBAL DEFAULT   N __pthread_threads_events
+-  OBJECT GLOBAL DEFAULT   N __pthread_threads_max
+-    FUNC GLOBAL DEFAULT   N __pthread_timedsuspend_new
+-    FUNC GLOBAL DEFAULT   N __pthread_unlock
+-    FUNC GLOBAL DEFAULT   N __pthread_wait_for_restart_signal
+-    FUNC GLOBAL DEFAULT   N __register_atfork
++    FUNC GLOBAL DEFAULT   N __pthread_key_create
++    FUNC GLOBAL DEFAULT   N __pthread_mutex_destroy
++    FUNC GLOBAL DEFAULT   N __pthread_mutex_init
++    FUNC GLOBAL DEFAULT   N __pthread_mutex_lock
++    FUNC GLOBAL DEFAULT   N __pthread_mutex_trylock
++    FUNC GLOBAL DEFAULT   N __pthread_mutex_unlock
++    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_destroy
++    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_init
++    FUNC GLOBAL DEFAULT   N __pthread_mutexattr_settype
++    FUNC GLOBAL DEFAULT   N __pthread_once
++    FUNC GLOBAL DEFAULT   N __pthread_register_cancel
++    FUNC GLOBAL DEFAULT   N __pthread_register_cancel_defer
++    FUNC GLOBAL DEFAULT   N __pthread_rwlock_destroy
++    FUNC GLOBAL DEFAULT   N __pthread_rwlock_init
++    FUNC GLOBAL DEFAULT   N __pthread_rwlock_rdlock
++    FUNC GLOBAL DEFAULT   N __pthread_rwlock_tryrdlock
++    FUNC GLOBAL DEFAULT   N __pthread_rwlock_trywrlock
++    FUNC GLOBAL DEFAULT   N __pthread_rwlock_unlock
++    FUNC GLOBAL DEFAULT   N __pthread_rwlock_wrlock
++    FUNC GLOBAL DEFAULT   N __pthread_setspecific
++    FUNC GLOBAL DEFAULT   N __pthread_unregister_cancel
++    FUNC GLOBAL DEFAULT   N __pthread_unregister_cancel_restore
++    FUNC GLOBAL DEFAULT   N __pthread_unwind
++    FUNC GLOBAL DEFAULT   N __pthread_unwind_next
++    FUNC   WEAK DEFAULT   N __pwrite64
++    FUNC   WEAK DEFAULT   N __read
++    FUNC GLOBAL DEFAULT UND __register_atfork
++    FUNC GLOBAL DEFAULT   N __res_state
++     TLS GLOBAL DEFAULT UND __resp
++    FUNC GLOBAL DEFAULT UND __sched_getparam
++    FUNC GLOBAL DEFAULT UND __sched_getscheduler
++    FUNC GLOBAL DEFAULT UND __sched_setscheduler
++    FUNC   WEAK DEFAULT   N __send
++    FUNC GLOBAL DEFAULT UND __setmntent
+     FUNC GLOBAL DEFAULT   N __sigaction
+-  OBJECT GLOBAL DEFAULT   N __sighandler
+-  NOTYPE GLOBAL DEFAULT ABS _edata
+-  NOTYPE GLOBAL DEFAULT ABS _end
+-    FUNC GLOBAL DEFAULT   N _fini
+-    FUNC GLOBAL DEFAULT   N _init
++    FUNC GLOBAL DEFAULT UND __statfs
++    FUNC GLOBAL DEFAULT UND __sysconf
++    FUNC GLOBAL DEFAULT UND __tls_get_addr
++  OBJECT GLOBAL DEFAULT UND __vdso_clock_gettime
++    FUNC GLOBAL DEFAULT   N __vfork
++    FUNC   WEAK DEFAULT   N __wait
++    FUNC   WEAK DEFAULT   N __write
++    FUNC GLOBAL DEFAULT UND _dl_allocate_tls
++    FUNC GLOBAL DEFAULT UND _dl_allocate_tls_init
++    FUNC GLOBAL DEFAULT UND _dl_deallocate_tls
++    FUNC GLOBAL DEFAULT UND _dl_get_tls_static_info
++    FUNC GLOBAL DEFAULT UND _dl_make_stack_executable
++    FUNC GLOBAL DEFAULT UND _exit
+     FUNC GLOBAL DEFAULT   N _pthread_cleanup_pop
+     FUNC GLOBAL DEFAULT   N _pthread_cleanup_pop_restore
+     FUNC GLOBAL DEFAULT   N _pthread_cleanup_push
+     FUNC GLOBAL DEFAULT   N _pthread_cleanup_push_defer
+-    FUNC GLOBAL DEFAULT   N compare_and_swap_is_available
+-    FUNC GLOBAL DEFAULT   N get_eflags
++  OBJECT GLOBAL DEFAULT UND _rtld_global
++    FUNC GLOBAL DEFAULT UND _setjmp
++    FUNC GLOBAL DEFAULT UND abort
++    FUNC   WEAK DEFAULT   N accept
++    FUNC GLOBAL DEFAULT UND calloc
++    FUNC   WEAK DEFAULT   N close
++    FUNC   WEAK DEFAULT   N connect
++     TLS GLOBAL DEFAULT UND errno
++    FUNC GLOBAL DEFAULT UND exit
++    FUNC GLOBAL DEFAULT UND fclose
++    FUNC   WEAK DEFAULT   N fcntl
++    FUNC   WEAK DEFAULT   N flockfile
++    FUNC GLOBAL DEFAULT UND fopen
++    FUNC GLOBAL DEFAULT   N fork
++    FUNC GLOBAL DEFAULT UND free
++    FUNC   WEAK DEFAULT   N fsync
++    FUNC   WEAK DEFAULT   N ftrylockfile
++    FUNC   WEAK DEFAULT   N funlockfile
++    FUNC GLOBAL DEFAULT UND getrlimit
++     TLS GLOBAL DEFAULT UND h_errno
++    FUNC GLOBAL DEFAULT UND link
+     FUNC GLOBAL DEFAULT   N longjmp
++    FUNC   WEAK DEFAULT   N lseek
++    FUNC   WEAK DEFAULT   N lseek64
++    FUNC GLOBAL DEFAULT UND malloc
++    FUNC GLOBAL DEFAULT UND memcpy
++    FUNC GLOBAL DEFAULT UND mempcpy
++    FUNC GLOBAL DEFAULT UND memset
++    FUNC GLOBAL DEFAULT UND mktemp
++    FUNC GLOBAL DEFAULT UND mmap
++    FUNC GLOBAL DEFAULT UND mprotect
++    FUNC   WEAK DEFAULT   N msync
++    FUNC GLOBAL DEFAULT UND munmap
++    FUNC   WEAK DEFAULT   N nanosleep
++    FUNC   WEAK DEFAULT   N open
++    FUNC   WEAK DEFAULT   N open64
++    FUNC   WEAK DEFAULT   N pause
++    FUNC   WEAK DEFAULT   N pread
++    FUNC   WEAK DEFAULT   N pread64
++    FUNC GLOBAL DEFAULT   N pthread_atfork
+     FUNC GLOBAL DEFAULT   N pthread_attr_destroy
++    FUNC GLOBAL DEFAULT   N pthread_attr_getaffinity_np
+     FUNC GLOBAL DEFAULT   N pthread_attr_getdetachstate
+-    FUNC   WEAK DEFAULT   N pthread_attr_getguardsize
++    FUNC GLOBAL DEFAULT   N pthread_attr_getguardsize
+     FUNC GLOBAL DEFAULT   N pthread_attr_getinheritsched
+     FUNC GLOBAL DEFAULT   N pthread_attr_getschedparam
+     FUNC GLOBAL DEFAULT   N pthread_attr_getschedpolicy
+     FUNC GLOBAL DEFAULT   N pthread_attr_getscope
+-    FUNC   WEAK DEFAULT   N pthread_attr_getstack
+-    FUNC   WEAK DEFAULT   N pthread_attr_getstacksize
++    FUNC GLOBAL DEFAULT   N pthread_attr_getstack
++    FUNC GLOBAL DEFAULT   N pthread_attr_getstackaddr
++    FUNC GLOBAL DEFAULT   N pthread_attr_getstacksize
+     FUNC GLOBAL DEFAULT   N pthread_attr_init
++    FUNC GLOBAL DEFAULT   N pthread_attr_setaffinity_np
+     FUNC GLOBAL DEFAULT   N pthread_attr_setdetachstate
+-    FUNC   WEAK DEFAULT   N pthread_attr_setguardsize
++    FUNC GLOBAL DEFAULT   N pthread_attr_setguardsize
+     FUNC GLOBAL DEFAULT   N pthread_attr_setinheritsched
+     FUNC GLOBAL DEFAULT   N pthread_attr_setschedparam
+     FUNC GLOBAL DEFAULT   N pthread_attr_setschedpolicy
+     FUNC GLOBAL DEFAULT   N pthread_attr_setscope
+-    FUNC   WEAK DEFAULT   N pthread_attr_setstack
+-    FUNC   WEAK DEFAULT   N pthread_attr_setstacksize
++    FUNC GLOBAL DEFAULT   N pthread_attr_setstack
++    FUNC GLOBAL DEFAULT   N pthread_attr_setstackaddr
++    FUNC GLOBAL DEFAULT   N pthread_attr_setstacksize
+     FUNC GLOBAL DEFAULT   N pthread_barrier_destroy
+     FUNC GLOBAL DEFAULT   N pthread_barrier_init
+     FUNC GLOBAL DEFAULT   N pthread_barrier_wait
+     FUNC GLOBAL DEFAULT   N pthread_barrierattr_destroy
++    FUNC GLOBAL DEFAULT   N pthread_barrierattr_getpshared
+     FUNC GLOBAL DEFAULT   N pthread_barrierattr_init
+     FUNC GLOBAL DEFAULT   N pthread_barrierattr_setpshared
+     FUNC GLOBAL DEFAULT   N pthread_cancel
+@@ -193,36 +178,49 @@
+     FUNC GLOBAL DEFAULT   N pthread_cond_timedwait
+     FUNC GLOBAL DEFAULT   N pthread_cond_wait
+     FUNC GLOBAL DEFAULT   N pthread_condattr_destroy
++    FUNC GLOBAL DEFAULT   N pthread_condattr_getclock
+     FUNC GLOBAL DEFAULT   N pthread_condattr_getpshared
+     FUNC GLOBAL DEFAULT   N pthread_condattr_init
++    FUNC GLOBAL DEFAULT   N pthread_condattr_setclock
+     FUNC GLOBAL DEFAULT   N pthread_condattr_setpshared
+     FUNC GLOBAL DEFAULT   N pthread_create
+     FUNC GLOBAL DEFAULT   N pthread_detach
+     FUNC GLOBAL DEFAULT   N pthread_equal
+     FUNC GLOBAL DEFAULT   N pthread_exit
++    FUNC GLOBAL DEFAULT   N pthread_getaffinity_np
+     FUNC GLOBAL DEFAULT   N pthread_getattr_np
+-    FUNC   WEAK DEFAULT   N pthread_getconcurrency
++    FUNC GLOBAL DEFAULT   N pthread_getconcurrency
++    FUNC GLOBAL DEFAULT   N pthread_getcpuclockid
+     FUNC GLOBAL DEFAULT   N pthread_getschedparam
+     FUNC GLOBAL DEFAULT   N pthread_getspecific
+     FUNC GLOBAL DEFAULT   N pthread_join
+     FUNC GLOBAL DEFAULT   N pthread_key_create
+     FUNC GLOBAL DEFAULT   N pthread_key_delete
+     FUNC GLOBAL DEFAULT   N pthread_kill
+-    FUNC   WEAK DEFAULT   N pthread_kill_other_threads_np
++    FUNC GLOBAL DEFAULT   N pthread_kill_other_threads_np
++    FUNC GLOBAL DEFAULT   N pthread_mutex_consistent_np
+     FUNC GLOBAL DEFAULT   N pthread_mutex_destroy
++    FUNC GLOBAL DEFAULT   N pthread_mutex_getprioceiling
+     FUNC GLOBAL DEFAULT   N pthread_mutex_init
+     FUNC GLOBAL DEFAULT   N pthread_mutex_lock
++    FUNC GLOBAL DEFAULT   N pthread_mutex_setprioceiling
+     FUNC GLOBAL DEFAULT   N pthread_mutex_timedlock
+     FUNC GLOBAL DEFAULT   N pthread_mutex_trylock
+     FUNC GLOBAL DEFAULT   N pthread_mutex_unlock
+     FUNC GLOBAL DEFAULT   N pthread_mutexattr_destroy
+     FUNC   WEAK DEFAULT   N pthread_mutexattr_getkind_np
+-    FUNC   WEAK DEFAULT   N pthread_mutexattr_getpshared
+-    FUNC   WEAK DEFAULT   N pthread_mutexattr_gettype
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_getprioceiling
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_getprotocol
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_getpshared
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_getrobust_np
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_gettype
+     FUNC GLOBAL DEFAULT   N pthread_mutexattr_init
+     FUNC   WEAK DEFAULT   N pthread_mutexattr_setkind_np
+-    FUNC   WEAK DEFAULT   N pthread_mutexattr_setpshared
+-    FUNC   WEAK DEFAULT   N pthread_mutexattr_settype
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_setprioceiling
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_setprotocol
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_setpshared
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_setrobust_np
++    FUNC GLOBAL DEFAULT   N pthread_mutexattr_settype
+     FUNC GLOBAL DEFAULT   N pthread_once
+     FUNC GLOBAL DEFAULT   N pthread_rwlock_destroy
+     FUNC GLOBAL DEFAULT   N pthread_rwlock_init
+@@ -240,27 +238,35 @@
+     FUNC GLOBAL DEFAULT   N pthread_rwlockattr_setkind_np
+     FUNC GLOBAL DEFAULT   N pthread_rwlockattr_setpshared
+     FUNC GLOBAL DEFAULT   N pthread_self
++    FUNC GLOBAL DEFAULT   N pthread_setaffinity_np
+     FUNC GLOBAL DEFAULT   N pthread_setcancelstate
+     FUNC GLOBAL DEFAULT   N pthread_setcanceltype
+-    FUNC   WEAK DEFAULT   N pthread_setconcurrency
+-    FUNC GLOBAL DEFAULT   N pthread_setegid_np
+-    FUNC GLOBAL DEFAULT   N pthread_seteuid_np
+-    FUNC GLOBAL DEFAULT   N pthread_setgid_np
+-    FUNC GLOBAL DEFAULT   N pthread_setregid_np
+-    FUNC GLOBAL DEFAULT   N pthread_setresgid_np
+-    FUNC GLOBAL DEFAULT   N pthread_setresuid_np
+-    FUNC GLOBAL DEFAULT   N pthread_setreuid_np
++    FUNC GLOBAL DEFAULT   N pthread_setconcurrency
+     FUNC GLOBAL DEFAULT   N pthread_setschedparam
++    FUNC GLOBAL DEFAULT   N pthread_setschedprio
+     FUNC GLOBAL DEFAULT   N pthread_setspecific
+-    FUNC GLOBAL DEFAULT   N pthread_setuid_np
+     FUNC GLOBAL DEFAULT   N pthread_sigmask
+-    FUNC   WEAK DEFAULT   N pthread_spin_destroy
+-    FUNC   WEAK DEFAULT   N pthread_spin_init
+-    FUNC   WEAK DEFAULT   N pthread_spin_lock
+-    FUNC   WEAK DEFAULT   N pthread_spin_trylock
+-    FUNC   WEAK DEFAULT   N pthread_spin_unlock
++    FUNC GLOBAL DEFAULT   N pthread_spin_destroy
++    FUNC GLOBAL DEFAULT   N pthread_spin_init
++    FUNC GLOBAL DEFAULT   N pthread_spin_lock
++    FUNC GLOBAL DEFAULT   N pthread_spin_trylock
++    FUNC GLOBAL DEFAULT   N pthread_spin_unlock
+     FUNC GLOBAL DEFAULT   N pthread_testcancel
++    FUNC GLOBAL DEFAULT   N pthread_timedjoin_np
++    FUNC GLOBAL DEFAULT   N pthread_tryjoin_np
++    FUNC GLOBAL DEFAULT   N pthread_yield
++    FUNC   WEAK DEFAULT   N pwrite
++    FUNC   WEAK DEFAULT   N pwrite64
+     FUNC GLOBAL DEFAULT   N raise
++    FUNC   WEAK DEFAULT   N read
++    FUNC GLOBAL DEFAULT UND realloc
++    FUNC   WEAK DEFAULT   N recv
++    FUNC   WEAK DEFAULT   N recvfrom
++    FUNC   WEAK DEFAULT   N recvmsg
++    FUNC GLOBAL DEFAULT UND sched_get_priority_max
++    FUNC GLOBAL DEFAULT UND sched_get_priority_min
++    FUNC GLOBAL DEFAULT UND sched_setparam
++    FUNC GLOBAL DEFAULT UND sched_yield
+     FUNC GLOBAL DEFAULT   N sem_close
+     FUNC GLOBAL DEFAULT   N sem_destroy
+     FUNC GLOBAL DEFAULT   N sem_getvalue
+@@ -271,8 +277,23 @@
+     FUNC GLOBAL DEFAULT   N sem_trywait
+     FUNC GLOBAL DEFAULT   N sem_unlink
+     FUNC GLOBAL DEFAULT   N sem_wait
+-    FUNC GLOBAL DEFAULT   N set_eflags
+-    FUNC GLOBAL DEFAULT   N sigaction
+-    FUNC GLOBAL DEFAULT   N siglongjmp
+-    FUNC GLOBAL DEFAULT   N sigwait
+-    FUNC GLOBAL DEFAULT   N testandset
++    FUNC   WEAK DEFAULT   N send
++    FUNC   WEAK DEFAULT   N sendmsg
++    FUNC   WEAK DEFAULT   N sendto
++    FUNC   WEAK DEFAULT   N sigaction
++    FUNC   WEAK DEFAULT   N siglongjmp
++    FUNC   WEAK DEFAULT   N sigwait
++    FUNC GLOBAL DEFAULT UND sscanf
++    FUNC GLOBAL DEFAULT UND strcmp
++    FUNC GLOBAL DEFAULT UND strlen
++    FUNC GLOBAL DEFAULT   N system
++    FUNC   WEAK DEFAULT   N tcdrain
++    FUNC GLOBAL DEFAULT UND tdelete
++    FUNC GLOBAL DEFAULT UND tfind
++    FUNC GLOBAL DEFAULT UND tsearch
++    FUNC GLOBAL DEFAULT UND twalk
++    FUNC GLOBAL DEFAULT UND unlink
++    FUNC   WEAK DEFAULT   N vfork
++    FUNC   WEAK DEFAULT   N wait
++    FUNC   WEAK DEFAULT   N waitpid
++    FUNC   WEAK DEFAULT   N write
+
+
+And uclibc_unrefd.lst is:
+
+__compare_and_swap
+__flockfilelist
+__fresetlockfiles
+__funlockfilelist
+__linuxthreads_create_event
+__linuxthreads_death_event
+__linuxthreads_initial_report_events
+__linuxthreads_pthread_key_2ndlevel_size
+__linuxthreads_pthread_keys_max
+__linuxthreads_pthread_sizeof_descr
+__linuxthreads_pthread_threads_max
+__linuxthreads_reap_event
+__linuxthreads_version
+__pthread_alt_lock
+__pthread_alt_timedlock
+__pthread_alt_unlock
+__pthread_attr_destroy
+__pthread_attr_getdetachstate
+__pthread_attr_getguardsize
+__pthread_attr_getinheritsched
+__pthread_attr_getschedparam
+__pthread_attr_getschedpolicy
+__pthread_attr_getscope
+__pthread_attr_getstack
+__pthread_attr_getstacksize
+__pthread_attr_init
+__pthread_attr_setdetachstate
+__pthread_attr_setguardsize
+__pthread_attr_setinheritsched
+__pthread_attr_setschedparam
+__pthread_attr_setschedpolicy
+__pthread_attr_setscope
+__pthread_attr_setstack
+__pthread_attr_setstacksize
+__pthread_barrierattr_getpshared
+__pthread_compare_and_swap
+__pthread_cond_broadcast
+__pthread_cond_destroy
+__pthread_cond_init
+__pthread_cond_signal
+__pthread_cond_timedwait
+__pthread_cond_wait
+__pthread_condattr_destroy
+__pthread_condattr_init
+__pthread_create
+__pthread_destroy_specifics
+__pthread_do_exit
+__pthread_equal
+__pthread_exit_code
+__pthread_exit_requested
+__pthread_find_self
+__pthread_functions
+__pthread_getconcurrency
+__pthread_getschedparam
+__pthread_getspecific
+__pthread_handles
+__pthread_handles_num
+__pthread_has_cas
+__pthread_init_max_stacksize
+__pthread_initial_thread
+__pthread_initial_thread_bos
+__pthread_initialize_manager
+__pthread_internal_tsd_address
+__pthread_internal_tsd_get
+__pthread_internal_tsd_set
+__pthread_key_create
+__pthread_kill_other_threads_np
+__pthread_last_event
+__pthread_lock
+__pthread_main_thread
+__pthread_manager
+__pthread_manager_adjust_prio
+__pthread_manager_event
+__pthread_manager_reader
+__pthread_manager_request
+__pthread_manager_sighandler
+__pthread_manager_thread
+__pthread_manager_thread_bos
+__pthread_manager_thread_tos
+__pthread_max_stacksize
+__pthread_mutex_destroy
+__pthread_mutex_timedlock
+__pthread_mutexattr_destroy
+__pthread_mutexattr_getkind_np
+__pthread_mutexattr_getpshared
+__pthread_mutexattr_gettype
+__pthread_mutexattr_init
+__pthread_mutexattr_setkind_np
+__pthread_mutexattr_setpshared
+__pthread_mutexattr_settype
+__pthread_nonstandard_stacks
+__pthread_null_sighandler
+__pthread_offsetof_descr
+__pthread_offsetof_pid
+__pthread_once_fork_child
+__pthread_once_fork_parent
+__pthread_once_fork_prepare
+__pthread_perform_cleanup
+__pthread_raise
+__pthread_reset_main_thread
+__pthread_restart_new
+__pthread_rwlock_destroy
+__pthread_rwlock_init
+__pthread_rwlock_rdlock
+__pthread_rwlock_timedrdlock
+__pthread_rwlock_timedwrlock
+__pthread_rwlock_tryrdlock
+__pthread_rwlock_trywrlock
+__pthread_rwlock_unlock
+__pthread_rwlock_wrlock
+__pthread_rwlockattr_destroy
+__pthread_self
+__pthread_setcancelstate
+__pthread_setcanceltype
+__pthread_setconcurrency
+__pthread_setschedparam
+__pthread_setspecific
+__pthread_sig_cancel
+__pthread_sig_debug
+__pthread_sig_restart
+__pthread_sigaction
+__pthread_sighandler
+__pthread_sighandler_rt
+__pthread_sigwait
+__pthread_sizeof_handle
+__pthread_smp_kernel
+__pthread_spin_destroy
+__pthread_spin_init
+__pthread_spin_lock
+__pthread_spin_trylock
+__pthread_spin_unlock
+__pthread_thread_self
+__pthread_threads_debug
+__pthread_threads_events
+__pthread_threads_max
+__pthread_timedsuspend_new
+__pthread_unlock
+__pthread_wait_for_restart_signal
+__register_atfork
+__sigaction
+__sighandler
+compare_and_swap_is_available
+get_eflags
+pthread_attr_getguardsize
+pthread_attr_getstack
+pthread_attr_getstacksize
+pthread_attr_setguardsize
+pthread_attr_setstack
+pthread_attr_setstacksize
+pthread_barrier_destroy
+pthread_barrier_init
+pthread_barrier_wait
+pthread_barrierattr_destroy
+pthread_barrierattr_init
+pthread_barrierattr_setpshared
+pthread_cancel
+pthread_condattr_getpshared
+pthread_condattr_setpshared
+pthread_create
+pthread_detach
+pthread_getattr_np
+pthread_getconcurrency
+pthread_getspecific
+pthread_join
+pthread_key_create
+pthread_key_delete
+pthread_kill
+pthread_kill_other_threads_np
+pthread_mutex_timedlock
+pthread_mutexattr_destroy
+pthread_mutexattr_getkind_np
+pthread_mutexattr_getpshared
+pthread_mutexattr_gettype
+pthread_mutexattr_init
+pthread_mutexattr_setkind_np
+pthread_mutexattr_setpshared
+pthread_mutexattr_settype
+pthread_rwlock_destroy
+pthread_rwlock_init
+pthread_rwlock_rdlock
+pthread_rwlock_timedrdlock
+pthread_rwlock_timedwrlock
+pthread_rwlock_tryrdlock
+pthread_rwlock_trywrlock
+pthread_rwlock_unlock
+pthread_rwlock_wrlock
+pthread_rwlockattr_destroy
+pthread_rwlockattr_getkind_np
+pthread_rwlockattr_getpshared
+pthread_rwlockattr_init
+pthread_rwlockattr_setkind_np
+pthread_rwlockattr_setpshared
+pthread_setconcurrency
+pthread_setegid_np
+pthread_seteuid_np
+pthread_setgid_np
+pthread_setregid_np
+pthread_setresgid_np
+pthread_setresuid_np
+pthread_setreuid_np
+pthread_setspecific
+pthread_setuid_np
+pthread_sigmask
+pthread_spin_destroy
+pthread_spin_init
+pthread_spin_lock
+pthread_spin_trylock
+pthread_spin_unlock
+pthread_testcancel
+sem_close
+sem_destroy
+sem_getvalue
+sem_init
+sem_open
+sem_post
+sem_timedwait
+sem_trywait
+sem_unlink
+sem_wait
+set_eflags
+testandset

Modified: branches/uClibc-nptl/extra/Configs/Config.in
===================================================================
--- branches/uClibc-nptl/extra/Configs/Config.in	2009-03-16 06:16:15 UTC (rev 25670)
+++ branches/uClibc-nptl/extra/Configs/Config.in	2009-03-16 06:52:00 UTC (rev 25671)
@@ -790,12 +790,13 @@
 
 config UCLIBC_LINUX_MODULE_24
 	bool "Linux kernel module functions"
-	default y
+	default !(TARGET_bfin)
 	help
 	  create_module, query_module
 	  are used in linux (prior to 2.6) for loadable kernel modules.
 
-	  Say N if you do not use kernel modules.
+	  Say N if you do not use kernel modules, or you only support
+	  Linux 2.6+.
 
 config UCLIBC_LINUX_SPECIFIC
 	bool "Linux specific functions"

Modified: branches/uClibc-nptl/extra/Configs/Config.in.arch
===================================================================
--- branches/uClibc-nptl/extra/Configs/Config.in.arch	2009-03-16 06:16:15 UTC (rev 25670)
+++ branches/uClibc-nptl/extra/Configs/Config.in.arch	2009-03-16 06:52:00 UTC (rev 25671)
@@ -16,6 +16,7 @@
 config UCLIBC_FORMAT_FDPIC_ELF
 	bool "FDPIC ELF"
 	depends on !ARCH_USE_MMU
+	select DOPIC
 config UCLIBC_FORMAT_FLAT
 	bool "STATIC FLAT"
 	depends on !ARCH_USE_MMU

Modified: branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c
===================================================================
--- branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c	2009-03-16 06:16:15 UTC (rev 25670)
+++ branches/uClibc-nptl/libc/sysdeps/linux/common/creat.c	2009-03-16 06:52:00 UTC (rev 25671)
@@ -2,7 +2,7 @@
 /*
  * creat() for uClibc
  *
- * Copyright (C) 2009 <kraj at uclibc.org>
+ * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
  *
  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  */

Modified: branches/uClibc-nptl/libc/sysdeps/linux/common/select.c
===================================================================
--- branches/uClibc-nptl/libc/sysdeps/linux/common/select.c	2009-03-16 06:16:15 UTC (rev 25670)
+++ branches/uClibc-nptl/libc/sysdeps/linux/common/select.c	2009-03-16 06:52:00 UTC (rev 25671)
@@ -9,6 +9,7 @@
 
 #include <sys/syscall.h>
 #include <sys/select.h>
+#include <stdint.h>
 
 #ifdef __UCLIBC_HAS_THREADS_NATIVE__
 #include <sysdep-cancel.h>
@@ -16,20 +17,65 @@
 #define SINGLE_THREAD_P 1
 #endif
 
+#define USEC_PER_SEC 1000000L
 
-libc_hidden_proto(select)
+extern __typeof(select) __libc_select;
 
+#if !defined(__NR__newselect) && !defined(__NR_select) && defined __USE_XOPEN2K
+# define __NR___libc_pselect6 __NR_pselect6
+_syscall6(int, __libc_pselect6, int, n, fd_set *, readfds, fd_set *, writefds,
+        fd_set *, exceptfds, const struct timespec *, timeout,
+        const sigset_t *, sigmask)
+
+int __libc_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+                  struct timeval *timeout)
+{
+	struct timespec _ts, *ts = 0;
+	if (timeout) {
+		uint32_t usec;
+		_ts.tv_sec = timeout->tv_sec;
+
+		/* GNU extension: allow for timespec values where the sub-sec
+		* field is equal to or more than 1 second.  The kernel will
+		* reject this on us, so take care of the time shift ourself.
+		* Some applications (like readline and linphone) do this.
+		* See 'clarification on select() type calls and invalid timeouts'
+		* on the POSIX general list for more information.
+		*/
+		usec = timeout->tv_usec;
+		if (usec >= USEC_PER_SEC) {
+			_ts.tv_sec += usec / USEC_PER_SEC;
+			usec %= USEC_PER_SEC;
+		}
+		_ts.tv_nsec = usec * 1000;
+
+		ts = &_ts;
+	}
+
+	if (SINGLE_THREAD_P)
+		return __libc_pselect6(n, readfds, writefds, exceptfds, ts, 0);
+#ifdef __UCLIBC_HAS_THREADS_NATIVE__
+	int oldtype = LIBC_CANCEL_ASYNC ();
+	int result = __libc_pselect6(n, readfds, writefds, exceptfds, ts, 0);
+	LIBC_CANCEL_RESET (oldtype);
+	return result;
+#endif
+
+}
+
+#else
+
 #ifdef __NR__newselect
-# undef __NR_select
-# define __NR_select __NR__newselect
+# define __NR___syscall_select __NR__newselect
+#else
+# define __NR___syscall_select __NR_select
 #endif
 
-#define __NR___syscall_select __NR_select
-static inline _syscall5(int, __syscall_select, int, n, fd_set *, readfds,
+_syscall5(int, __syscall_select, int, n, fd_set *, readfds,
 		fd_set *, writefds, fd_set *, exceptfds, struct timeval *, timeout);
 
-int select(int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds,
-		   struct timeval * timeout)
+int __libc_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+                  struct timeval *timeout)
 {
 	if (SINGLE_THREAD_P)
 		return __syscall_select(n, readfds, writefds, exceptfds, timeout);
@@ -42,4 +88,7 @@
 #endif
 }
 
-libc_hidden_def(select)
+#endif
+
+weak_alias(__libc_select,select)
+libc_hidden_weak(select)



More information about the uClibc-cvs mailing list