Subject: More ld.elf_so/startup tweaks
To: None <tech-userlevel@netbsd.org>
From: Charles M. Hannum <abuse@spamalicious.com>
List: tech-userlevel
Date: 09/24/2002 18:39:47
So I did another experiment...

I've built libc with an intermediate step that uses `objcopy
--localize-symbols' to bind internal references directly and remove
symbols from the exported symbol table.  This significantly reduces
the number of symbol-relative relocations; in fact, with the 806
symbols I elided, it reduces the number of such relocations from 917
to 380.

This corresponds to about a 16.1% improvement in the simple-exec-loop
test case, making the dynamic version about 4.3x slower than than the
static version.

The 806 symbols I removed are mostly internal DB functions and symbols
that are renamed in namespace.h so they will intentionally use the
libc versions.  None of these are supposed to be used by other code
anyway.

I haven't yet checked in libc/Makefile changes to do this; I thought I
would solicit comments here first...

-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----
_CurrentMessagesLocale   
_CurrentMonetaryLocale   
_CurrentNumericLocale    
_CurrentRuneLocale       
_CurrentTimeLocale       
_DefaultMessagesLocale   
_DefaultMonetaryLocale   
_DefaultNumericLocale    
_DefaultRuneLocale       
_DefaultTimeLocale       
_MD2Final
_MD2Init
_MD2Update
_MD4Final
_MD4Init
_MD4Update
_MD5Final
_MD5Init
_MD5Update
_NukeRune
_PathLocale
_RMD160Data
_RMD160End
_RMD160File
_RMD160Final
_RMD160Init
_RMD160Transform
_RMD160Update
_Read_CTypeAsRune
_Read_RuneMagi
_SHA1Data
_SHA1End
_SHA1File
_SHA1Final
_SHA1Init
_SHA1Transform
_SHA1Update
___runetype_mb
___tolower_mb
___toupper_mb
__add_ovflpage
__addel
__atexit
__big_delete
__big_insert
__big_keydata
__big_return
__big_split
__bt_close
__bt_cmp
__bt_defcmp
__bt_defpfx
__bt_delete
__bt_dleaf
__bt_fd
__bt_free
__bt_get
__bt_new
__bt_open
__bt_pgin
__bt_pgout
__bt_put
__bt_ret
__bt_search
__bt_seq
__bt_setcur
__bt_split
__bt_sync
__buf_free
__buf_init
__call_hash
__check_rhosts_file
__clockctl_fd
__curbrk
__dbpanic
__default_hash
__delpair
__dladdr
__dlclose
__dlerror
__dlopen
__dlsym
__dorand48
__dtoa
__expand_table
__fdnlist_aout
__fdnlist_elf32
__find_bigpair
__find_last_page
__findenv
__fmtcheck
__free_ovflpage
__get_buf
__get_page
__getcwd
__gettemp
__hash_open
__ibitmap
__is_ws
__ivaliduser
__ivaliduser_sa
__loadctype
__log2
__logname_valid
__mb_len_max_runtime
__minbrk
__mlocale_changed
__nlocale_changed
__nsdefaultsrc
__ovfl_delete
__ovfl_get
__ovfl_put
__put_page
__pw_scan
__rand48_add
__rand48_mult
__rand48_seed
__rcmd_errstr
__rec_close
__rec_delete
__rec_dleaf
__rec_fd
__rec_fmap
__rec_fpipe
__rec_get
__rec_iput
__rec_open
__rec_put
__rec_ret
__rec_search
__rec_seq
__rec_sync
__rec_vmap
__rec_vpipe
__reclaim_buf
__rpc_broadenable
__rpc_control
__rpc_dtbsize
__rpc_fixup_addr
__rpc_freebroadifs
__rpc_getbroadifs
__rpc_getconfip
__rpc_lowvers
__rpc_rawcombuf
__rpc_sockisbound
__rpc_socktype2seman
__rpc_taddr2uaddr_af
__rpc_uaddr2taddr_af
__rpcb_findaddr
__rpcgettp
__runetable_to_netbsd_ctype
__sFext
__savectype
__sclose
__sdidinit
__sflags
__sflush
__sfp
__sglue
__sigintr
__sinit
__slbexpand
__smakebuf
__split_page
__sread
__srefill
__sseek
__strerror
__svfscanf
__swhatbuf
__swrite
__swsetup
__sysconf
__unaliasname
__yp_token
__yp_unbind
_a64l
_adjtime
_alarm
_alphasort
_asctime_r
_asprintf
_atoll
_authnone_create
_authunix_create
_authunix_create_default
_basename
_bindresvport
_bindresvport_sa
_bm_comp
_bm_exec
_bm_free
_brk
_callrpc
_catclose
_catgets
_catopen
_cfgetispeed
_cfgetospeed
_cfmakeraw
_cfsetispeed
_cfsetospeed
_cfsetspeed
_cgetcap
_cgetclose
_cgetent
_cgetfirst
_cgetmatch
_cgetnext
_cgetnum
_cgetset
_cgetstr
_cgetustr
_citrus_NONE_ctype_ops   
_citrus_ctype_close
_citrus_ctype_default    
_citrus_ctype_open
_citrus_find_getops
_citrus_load_module
_citrus_unload_module
_clnt_broadcast
_clnt_create
_clnt_create_vers
_clnt_dg_create
_clnt_pcreateerror
_clnt_perrno
_clnt_perror
_clnt_raw_create
_clnt_spcreateerror
_clnt_sperrno
_clnt_sperror
_clnt_tli_create
_clnt_tp_create
_clnt_vc_create
_clntraw_create
_clnttcp_create
_clntudp_bufcreate
_clntudp_create
_clock_settime
_closedir
_closelog
_confstr
_ctermid
_ctime_r
_daemon
_daylight
_dbm_clearerr
_dbm_close
_dbm_delete
_dbm_dirfno
_dbm_error
_dbm_fetch
_dbm_firstkey
_dbm_nextkey
_dbm_open
_dbm_store
_dbopen
_devname
_dirname
_dn_expand
_dns_gethtbyaddr         
_dns_gethtbyname         
_dns_getnetbyaddr        
_dns_getnetbyname        
_drand48
_endfsent
_endgrent
_endhostent
_endhtent
_endnetconfig
_endnetent
_endnetgrent
_endprotoent
_endpwent
_endrpcent
_endservent
_endttyent
_endusershell
_erand48
_err
_errx
_ether_aton
_ether_hostton
_ether_line
_ether_ntoa
_ether_ntohost
_execl
_execle
_execlp
_execv
_execvp
_fdopen
_fgetln
_files_getnetbyaddr      
_files_getnetbyname      
_findrunelocale
_fnmatch
_fork
_fpgetmask
_fpgetround
_fpgetsticky
_fpsetmask
_fpsetround
_fpsetsticky
_freeaddrinfo
_freeifaddrs
_freenetconfigent
_fseeko
_ftello
_ftok
_ftruncate
_fts_children
_fts_close
_fts_open
_fts_read
_fts_set
_fwalk
_gai_strerror
_get_myaddress
_get_next_token
_getaddrinfo
_getbsize
_getcwd
_getdiskbyname
_getdomainname
_getfsent
_getfsfile
_getfsspec
_getgrent
_getgrgid
_getgrnam
_getgrouplist
_gethostbyaddr
_gethostbyname
_gethostname
_gethtbyaddr
_gethtbyname
_gethtbyname2
_gethtent
_getifaddrs
_getloadavg
_getlogin
_getmntinfo
_getmode
_getnameinfo
_getnetbyaddr
_getnetbyname
_getnetconfig
_getnetconfigent
_getnetent
_getnetgrent
_getnetpath
_getopt
_getopt_long
_getpagesize
_getpass
_getprogname
_getprotobyname
_getprotobynumber
_getprotoent
_getpwent
_getpwnam
_getpwuid
_getrpcbyname
_getrpcbynumber
_getrpcent
_getrpcport
_getservbyname
_getservbyport
_getservent
_getsubopt
_getttyent
_getttynam
_getusershell
_glob
_globfree
_gmtime_r
_group_from_gid
_heapsort
_herror
_hes_error
_hes_free
_hes_init
_hes_resolve
_hes_to_bind
_hesiod_end
_hesiod_free_list
_hesiod_init
_hesiod_resolve
_hesiod_to_bind
_if_freenameindex
_if_indextoname
_if_nameindex
_if_nametoindex
_in6addr_any
_in6addr_linklocal_allnodes
_in6addr_loopback
_in6addr_nodelocal_allnodes
_inet6_option_alloc
_inet6_option_append
_inet6_option_find
_inet6_option_init
_inet6_option_next
_inet6_option_space
_inet6_rthdr_add
_inet6_rthdr_getaddr
_inet6_rthdr_getflags
_inet6_rthdr_init
_inet6_rthdr_lasthop
_inet6_rthdr_segments
_inet6_rthdr_space
_inet_aton
_inet_lnaof
_inet_makeaddr
_inet_net_ntop
_inet_net_pton
_inet_neta
_inet_netof
_inet_network
_inet_nsap_addr
_inet_nsap_ntoa
_inet_ntoa
_inet_ntop
_inet_pton
_initgroups
_initstate
_innetgr
_isatty
_isinf
_isnan
_jrand48
_l64a
_l64a_r
_lcong48
_llabs
_lldiv
_localtime_r
_lockf
_lrand48
_lseek
_mergesort
_mktemp
_mmap
_mpool_close
_mpool_filter
_mpool_get
_mpool_new
_mpool_open
_mpool_put
_mpool_sync
_mrand48
_nc_perror
_nc_sperror
_net_stayopen
_newrunelocale
_ng_parse
_nice
_nrand48
_nscmp
_nsdispatch
_nsyy_create_buffer
_nsyy_delete_buffer
_nsyy_flush_buffer
_nsyy_init_buffer
_nsyy_load_buffer_state
_nsyy_scan_buffer
_nsyy_scan_bytes
_nsyy_scan_string
_nsyy_switch_to_buffer
_nsyychar
_nsyycheck
_nsyydefred
_nsyydgoto
_nsyyerrflag
_nsyyerror
_nsyygindex
_nsyyin
_nsyylen
_nsyyleng
_nsyylex
_nsyylhs
_nsyylineno
_nsyylval
_nsyynerrs
_nsyyout
_nsyyparse
_nsyyrestart
_nsyyrindex
_nsyysindex
_nsyyss
_nsyysslim
_nsyyssp
_nsyystacksize
_nsyytable
_nsyytext
_nsyyval
_nsyyvs
_nsyyvsp
_nsyywrap
_ntp_adjtime
_offtime
_opendir
_openlog
_pause
_pclose
_pipe
_pmap_getmaps
_pmap_getport
_pmap_rmtcall
_pmap_set
_pmap_unset
_popen
_posix2time
_pread
_proto_stayopen
_psignal
_putenv
_pwcache_groupdb
_pwcache_userdb
_pwrite
_qabs
_qdiv
_radixsort
_random
_readdir
_realpath
_regcomp
_regerror
_regexec
_regfree
_registerrpc
_res_init
_res_mkquery
_res_query
_res_search
_rewinddir
_rpc_broadcast
_rpc_broadcast_exp
_rpc_call
_rpc_reg
_rpcb_getmaps
_rpcb_gettime
_rpcb_rmtcall
_rpcb_set
_rpcb_taddr2uaddr
_rpcb_uaddr2taddr
_rpcb_unset
_sbrk
_scandir
_seed48
_seekdir
_send
_serv_stayopen
_setdomainname
_setenv
_setfsent
_setgrent
_setgroupent
_sethostent
_sethostname
_sethtent
_setlogmask
_setmode
_setnetconfig
_setnetent
_setnetgrent
_setnetpath
_setpassent
_setproctitle
_setprotoent
_setpwent
_setrpcent
_setservent
_setstate
_settimeofday
_setttyent
_setusershell
_shm_open
_shm_unlink
_siginterrupt
_signal
_sl_add
_sl_find
_sl_free
_sl_init
_sleep
_snprintf
_sradixsort
_srand48
_srandom
_strcasecmp
_strdup
_strlcat
_strlcpy
_strncasecmp
_strptime
_strsep
_strsignal
_strsvis
_strsvisx
_strtoimax
_strtok_r
_strtoll
_strtoull
_strtoumax
_strunvis
_strvis
_strvisx
_svc_auth_reg
_svc_create
_svc_dg_create
_svc_exit
_svc_fd_create
_svc_getreq
_svc_getreq_common
_svc_getreqset
_svc_raw_create
_svc_reg
_svc_register
_svc_run
_svc_sendreply
_svc_tli_create
_svc_tp_create
_svc_unreg
_svc_unregister
_svc_vc_create
_svcerr_auth
_svcerr_decode
_svcerr_noproc
_svcerr_noprog
_svcerr_progvers
_svcerr_systemerr
_svcerr_weakauth
_svcfd_create
_svcraw_create
_svctcp_create
_svcudp_bufcreate
_svcudp_create
_svcudp_enablecache
_svis
_sys_errlist
_sys_nerr
_sys_nsig
_sys_siglist
_sysarch
_sysctl
_syslog
_tcdrain
_tcflow
_tcflush
_tcgetattr
_tcgetpgrp
_tcgetsid
_tcsendbreak
_tcsetattr
_tcsetpgrp
_telldir
_time
_time2posix
_timegm
_timelocal
_timeoff
_times
_ttyname
_ttyslot
_tzname
_tzset
_tzsetwall
_tztab
_ualarm
_uname
_unsetenv
_unvis
_user_from_uid
_usleep
_utime
_valloc
_verr
_verrx
_vis
_vsnprintf
_vsyslog
_vwarn
_vwarnx
_wait
_wait3
_waitpid
_warn
_warnx
_xdr_accepted_reply
_xdr_array
_xdr_authunix_parms
_xdr_bool
_xdr_bytes
_xdr_callhdr
_xdr_callmsg
_xdr_char
_xdr_datum
_xdr_des_block
_xdr_domainname
_xdr_double
_xdr_enum
_xdr_float
_xdr_free
_xdr_hyper
_xdr_int
_xdr_int16_t
_xdr_int32_t
_xdr_int64_t
_xdr_long
_xdr_longlong_t
_xdr_mapname
_xdr_netbuf
_xdr_netobj
_xdr_opaque
_xdr_opaque_auth
_xdr_peername
_xdr_pmap
_xdr_pmaplist
_xdr_pointer
_xdr_reference
_xdr_rejected_reply
_xdr_replymsg
_xdr_rmtcall_args
_xdr_rmtcallres
_xdr_rpcb
_xdr_rpcb_entry
_xdr_rpcb_entry_list_ptr
_xdr_rpcb_rmtcallargs
_xdr_rpcb_rmtcallres
_xdr_rpcb_stat
_xdr_rpcb_stat_byvers
_xdr_rpcblist
_xdr_rpcblist_ptr
_xdr_rpcbs
_xdr_rpcbs_addrlist
_xdr_rpcbs_addrlist_ptr
_xdr_rpcbs_proc
_xdr_rpcbs_rmtcalllist
_xdr_rpcbs_rmtcalllist_ptr
_xdr_short
_xdr_string
_xdr_u_char
_xdr_u_hyper
_xdr_u_int
_xdr_u_int16_t
_xdr_u_int32_t
_xdr_u_int64_t
_xdr_u_long
_xdr_u_longlong_t
_xdr_u_short
_xdr_union
_xdr_vector
_xdr_void
_xdr_wrapstring
_xdr_yp_inaddr
_xdr_ypall
_xdr_ypbind_resp
_xdr_ypbind_setdom
_xdr_ypdomain_wrap_string
_xdr_ypmap_parms
_xdr_ypmap_wrap_string
_xdr_ypmaplist
_xdr_ypowner_wrap_string
_xdr_yppushresp_xfr
_xdr_ypreq_key
_xdr_ypreq_nokey
_xdr_ypreq_xfr
_xdr_ypresp_key_val
_xdr_ypresp_maplist
_xdr_ypresp_master
_xdr_ypresp_order
_xdr_ypresp_val
_xdrmem_create
_xdrrec_create
_xdrrec_endofrecord
_xdrrec_eof
_xdrrec_skiprecord
_xdrstdio_create
_xpg4_setrunelocale
_xprt_register
_xprt_unregister
_yp_all
_yp_bind
_yp_first
_yp_get_default_domain
_yp_gethtbyaddr          
_yp_gethtbyname          
_yp_getnetbyaddr         
_yp_getnetbyname         
_yp_invalid_domain
_yp_maplist
_yp_master
_yp_match
_yp_next
_yp_order
_yp_unbind
_ypbindlist
_yperr_string
_yphostent
_yplib_cache
_yplib_nerrs
_yplib_rpc_timeout
_yplib_timeout
_ypnetnet
_ypprot_err
-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----