1. 30 8月, 2017 1 次提交
    • A
      __init_libc: add fallbacks for __progname setup · c7f56b4d
      Alexander Monakov 提交于
      It is possible for argv[0] to be a null pointer, but the __progname
      variable is used to implement functions in src/legacy/err.c that do not
      expect it to be null. It is also available to the user via the
      program_invocation_name alias as a GNU extension, and the implementation
      in Glibc initializes it to a pointer to empty string rather than NULL.
      
      Since argv[0] is usually non-null and it's preferable to keep those
      variables in BSS, implement the fallbacks in __init_libc, which also
      allows to have an intermediate fallback to AT_EXECFN.
      c7f56b4d
  2. 20 11月, 2015 1 次提交
    • R
      remove undef weak refs to init/fini array symbols in libc.so · 19caa25d
      Rich Felker 提交于
      commit ad1cd43a eliminated
      preprocessor-level omission of references to the init/fini array
      symbols from object files going into libc.so. the references are weak,
      and the intent was that the linker would resolve them to zero in
      libc.so, but instead it leaves undefined references that could be
      satisfied at runtime. normally these references would be harmless,
      since the code using them does not even get executed, but some older
      binutils versions produce a linking error: when linking a program
      against libc.so, ld first tries to use the hidden init/fini array
      symbols produced by the linker script to satisfy the references in
      libc.so, then produces an error because the definitions are hidden.
      
      ideally ld would have already provided definitions of these symbols
      when linking libc.so, but the linker script for -shared omits them.
      
      to avoid this situation, the dynamic linker now provides its own dummy
      definitions of the init/fini array symbols for libc.so. since they are
      hidden, everything binds at ld time and no references remain in the
      dynamic symbol table. with modern binutils and --gc-sections, both
      the dummy empty array objects and the code referencing them get
      dropped at link time, anyway.
      
      the _init and _fini symbols are also switched back to using weak
      definitions rather than weak references since the latter behave
      somewhat problematically in general, and the weak definition approach
      was known to work well.
      19caa25d
  3. 12 11月, 2015 1 次提交
    • R
      unify static and dynamic libc init/fini code paths · ad1cd43a
      Rich Felker 提交于
      use weak definitions that the dynamic linker can override instead of
      preprocessor conditionals on SHARED so that the same libc start and
      exit code can be used for both static and dynamic linking.
      ad1cd43a
  4. 23 9月, 2015 1 次提交
    • R
      move calls to application init functions after crt1 entry point · c87a5210
      Rich Felker 提交于
      this change is needed to be compatible with fdpic, where some of the
      main application's relocations may be performed as part of the crt1
      entry point. if we call init functions before passing control, these
      relocations will not yet have been performed, and the init code will
      potentially make use of invalid pointers.
      
      conceptually, no code provided by the application or third-party
      libraries should run before the application entry point. the
      difference is not observable to programs using the crt1 we provide,
      but it could come into play if custom entry point code is used, so
      it's better to be doing this right anyway.
      c87a5210
  5. 22 4月, 2015 1 次提交
  6. 02 7月, 2014 1 次提交
  7. 30 5月, 2014 1 次提交
    • R
      support linux kernel apis (new archs) with old syscalls removed · dd5f50da
      Rich Felker 提交于
      such archs are expected to omit definitions of the SYS_* macros for
      syscalls their kernels lack from arch/$ARCH/bits/syscall.h. the
      preprocessor is then able to select the an appropriate implementation
      for affected functions. two basic strategies are used on a
      case-by-case basis:
      
      where the old syscalls correspond to deprecated library-level
      functions, the deprecated functions have been converted to wrappers
      for the modern function, and the modern function has fallback code
      (omitted at the preprocessor level on new archs) to make use of the
      old syscalls if the new syscall fails with ENOSYS. this also improves
      functionality on older kernels and eliminates the incentive to program
      with deprecated library-level functions for the sake of compatibility
      with older kernels.
      
      in other situations where the old syscalls correspond to library-level
      functions which are not deprecated but merely lack some new features,
      such as the *at functions, the old syscalls are still used on archs
      which support them. this may change at some point in the future if or
      when fallback code is added to the new functions to make them usable
      (possibly with reduced functionality) on old kernels.
      dd5f50da
  8. 25 5月, 2014 1 次提交
    • R
      support kernels with no SYS_open syscall, only SYS_openat · 594c827a
      Rich Felker 提交于
      open is handled specially because it is used from so many places, in
      so many variants (2 or 3 arguments, setting errno or not, and
      cancellable or not). trying to do it as a function would not only
      increase bloat, but would also risk subtle breakage.
      
      this is the first step towards supporting "new" archs where linux
      lacks "old" syscalls.
      594c827a
  9. 22 4月, 2014 3 次提交
    • R
      make __init_libc static for non-shared libc · 3176b57e
      Rich Felker 提交于
      being static allows it to be inlined in __libc_start_main; inlining
      should take place at all levels since the function is called exactly
      once. this further reduces mandatory startup code size for static
      binaries.
      3176b57e
    • R
      further micro-optimize startup code for size · fbcfed7c
      Rich Felker 提交于
      there is no reason (and seemingly there never was any) for
      __init_security to be its own function. it's linked unconditionally
      so it can just be placed inline in __init_libc.
      fbcfed7c
    • R
      micro-optimize some startup code for size · 9b52ab1c
      Rich Felker 提交于
      moving the call to __init_ssp from __init_security to __init_libc
      makes __init_security a leaf function, which allows the compiler to
      make it smaller. __init_libc is already non-leaf, and the additional
      call makes no difference to the amount of register spillage.
      
      in addition, it really made no sense for the call to __init_ssp to be
      buried inside __init_security rather than parallel with other init
      functions.
      9b52ab1c
  10. 07 4月, 2014 1 次提交
  11. 15 9月, 2013 1 次提交
    • S
      support configurable page size on mips, powerpc and microblaze · b20760c0
      Szabolcs Nagy 提交于
      PAGE_SIZE was hardcoded to 4096, which is historically what most
      systems use, but on several archs it is a kernel config parameter,
      user space can only know it at execution time from the aux vector.
      
      PAGE_SIZE and PAGESIZE are not defined on archs where page size is
      a runtime parameter, applications should use sysconf(_SC_PAGE_SIZE)
      to query it. Internally libc code defines PAGE_SIZE to libc.page_size,
      which is set to aux[AT_PAGESZ] in __init_libc and early in __dynlink
      as well. (Note that libc.page_size can be accessed without GOT, ie.
      before relocations are done)
      
      Some fpathconf settings are hardcoded to 4096, these should be actually
      queried from the filesystem using statfs.
      b20760c0
  12. 21 7月, 2013 1 次提交
    • R
      add support for init/fini array in main program, and greatly simplify · 7586360b
      Rich Felker 提交于
      modern (4.7.x and later) gcc uses init/fini arrays, rather than the
      legacy _init/_fini function pasting and crtbegin/crtend ctors/dtors
      system, on most or all archs. some archs had already switched a long
      time ago. without following this change, global ctors/dtors will cease
      to work under musl when building with new gcc versions.
      
      the most surprising part of this patch is that it actually reduces the
      size of the init code, for both static and shared libc. this is
      achieved by (1) unifying the handling main program and shared
      libraries in the dynamic linker, and (2) eliminating the
      glibc-inspired rube goldberg machine for passing around init and fini
      function pointers. to clarify, some background:
      
      the function signature for __libc_start_main was based on glibc, as
      part of the original goal of being able to run some glibc-linked
      binaries. it worked by having the crt1 code, which is linked into
      every application, static or dynamic, obtain and pass pointers to the
      init and fini functions, which __libc_start_main is then responsible
      for using and recording for later use, as necessary. however, in
      neither the static-linked nor dynamic-linked case do we actually need
      crt1.o's help. with dynamic linking, all the pointers are available in
      the _DYNAMIC block. with static linking, it's safe to simply access
      the _init/_fini and __init_array_start, etc. symbols directly.
      
      obviously changing the __libc_start_main function signature in an
      incompatible way would break both old musl-linked programs and
      glibc-linked programs, so let's not do that. instead, the function can
      just ignore the information it doesn't need. new archs need not even
      provide the useless args in their versions of crt1.o. existing archs
      should continue to provide it as long as there is an interest in
      having newly-linked applications be able to run on old versions of
      musl; at some point in the future, this support can be removed.
      7586360b
  13. 07 4月, 2013 1 次提交
    • R
      add support for program_invocation[_short]_name · b4ea6385
      Rich Felker 提交于
      this is a bit ugly, and the motivation for supporting it is
      questionable. however the main factors were:
      1. it will be useful to have this for certain internal purposes
      anyway -- things like syslog.
      2. applications can just save argv[0] in main, but it's hard to fix
      non-portable library code that's depending on being able to get the
      invocation name without the main application's help.
      b4ea6385
  14. 01 12月, 2012 1 次提交
    • R
      fix ordering of shared library ctors with respect to libc init · a7936f61
      Rich Felker 提交于
      previously, shared library constructors were being called before
      important internal things like the environment (extern char **environ)
      and hwcap flags (needed for sjlj to work right with float on arm) were
      initialized in __libc_start_main. rather than trying to have to
      dynamic linker make sure this stuff all gets initialized right, I've
      opted to just defer calling shared library constructors until after
      the main program's entry point is reached. this also fixes the order
      of ctors to be the exact reverse of dtors, which is a desirable
      property and possibly even mandated by some languages.
      
      the main practical effect of this change is that shared libraries
      calling getenv from ctors will no longer fail.
      a7936f61
  15. 12 10月, 2012 1 次提交
  16. 08 10月, 2012 2 次提交
    • R
      f2b1f1af
    • R
      clean up and refactor program initialization · 0a96a37f
      Rich Felker 提交于
      the code in __libc_start_main is now responsible for parsing auxv,
      rather than duplicating the parsing all over the place. this should
      shave off a few cycles and some code size. __init_libc is left as an
      external-linkage function despite the fact that it could be static, to
      prevent it from being inlined and permanently wasting stack space when
      main is called.
      
      a few other minor changes are included, like eliminating per-thread
      ssp canaries (they were likely broken when combined with certain
      dlopen usages, and completely unnecessary) and some other unnecessary
      checks. since this code gets linked into every program, it should be
      as small and simple as possible.
      0a96a37f
  17. 05 10月, 2012 1 次提交
    • R
      TLS (GNU/C11 thread-local storage) support for static-linked programs · 8431d797
      Rich Felker 提交于
      the design for TLS in dynamic-linked programs is mostly complete too,
      but I have not yet implemented it. cost is nonzero but still low for
      programs which do not use TLS and/or do not use threads (a few hundred
      bytes of new code, plus dependency on memcpy). i believe it can be
      made smaller at some point by merging __init_tls and __init_security
      into __libc_start_main and avoiding duplicate auxv-parsing code.
      
      at the same time, I've also slightly changed the logic pthread_create
      uses to allocate guard pages to ensure that guard pages are not
      counted towards commit charge.
      8431d797
  18. 23 8月, 2011 1 次提交
    • R
      security hardening: ensure suid programs have valid stdin/out/err · df0b5a49
      Rich Felker 提交于
      this behavior (opening fds 0-2 for a suid program) is explicitly
      allowed (but not required) by POSIX to protect badly-written suid
      programs from clobbering files they later open.
      
      this commit does add some cost in startup code, but the availability
      of auxv and the security flag will be useful elsewhere in the future.
      in particular auxv is needed for static-linked vdso support, which is
      still waiting to be committed (sorry nik!)
      df0b5a49
  19. 12 2月, 2011 1 次提交