1. 24 9月, 2015 1 次提交
    • R
      fix signal return for sh/fdpic · b61df229
      Rich Felker 提交于
      the restorer function pointer provided in the kernel sigaction
      structure is interpreted by the kernel as a raw code address, not a
      function descriptor.
      
      this commit moves the declarations of the __restore and __restore_rt
      symbols to ksigaction.h so that arch versions of the file can override
      them, and introduces a version for sh which declares them as objects
      rather than functions.
      
      an alternate solution would have been defining SA_RESTORER to 0 so
      that the functions are not used, but this both requires executable
      stack (since the sh kernel does not have a vdso page with permanent
      restorer functions) and crashes on qemu user-level emulation.
      b61df229
  2. 23 9月, 2015 6 次提交
    • R
      fix dlsym RTLD_NEXT behavior for fdpic · 6c5cad2a
      Rich Felker 提交于
      lookup the dso an address falls in based on the loadmap and not just a
      base/length. fix the main app's fake loadmap used when loaded by a
      non-fdpic-aware loader so that it does not cover the whole memory
      space.
      
      function descriptor addresses are also matched for future use by
      dladdr, but reverse lookups of function descriptors via dladdr have
      not been implemented yet. some revisions may be needed in the future
      once reclaim_gaps supports fdpic, so that function descriptors
      allocated in reclaimed heap space do not get detected as belonging to
      the module whose gaps they were allocated in.
      6c5cad2a
    • R
      fix dlsym lookup of function symbols on fdpic · d47d9a50
      Rich Felker 提交于
      previously these resolved to the code address rather than the address
      of the function descriptor.
      
      the conditions for accepting or rejecting symbols are quite
      inconsistent between the different points in the dynamic linker code
      where such decisions are made. this commit attempts to be at least as
      correct as anything already there, but does not improve consistency.
      it has been tested to correctly avoid symbols that are merely
      references to functions defined in other modules, at least in simple
      usage, but at some point all symbol lookup logic should be reviewed
      and refactored/unified.
      d47d9a50
    • 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
    • R
      fix breakage in non-fdpic dynamic linker init/fini processing · 78f43029
      Rich Felker 提交于
      a mistaken #ifdef instead of #if caused conversion of code addresses
      to function descriptors to be performed even on non-fdpic.
      78f43029
    • R
      30fdc06b
    • R
      add real fdpic loading of shared libraries · eaf7ab6e
      Rich Felker 提交于
      previously, the normal ELF library loading code was used even for
      fdpic, so only the kernel-loaded dynamic linker and main app could
      benefit from separate placement of segments and shared text.
      eaf7ab6e
  3. 22 9月, 2015 3 次提交
    • R
      add general fdpic support in dynamic linker and arch support for sh · 7a9669e9
      Rich Felker 提交于
      at this point not all functionality is complete. the dynamic linker
      itself, and main app if it is also loaded by the kernel, take
      advantage of fdpic and do not need constant displacement between
      segments, but additional libraries loaded by the dynamic linker follow
      normal ELF semantics for mapping still. this fully works, but does not
      admit shared text on nommu.
      
      in terms of actual functional correctness, dlsym's results are
      presently incorrect for function symbols, RTLD_NEXT fails to identify
      the caller correctly, and dladdr fails almost entirely.
      
      with the dynamic linker entry point working, support for static pie is
      automatically included, but linking the main application as ET_DYN
      (pie) probably does not make sense for fdpic anyway. ET_EXEC is
      equally relocatable but more efficient at representing relocations.
      7a9669e9
    • R
      factor symbol counting out of dladdr as its own function · 3958144e
      Rich Felker 提交于
      the fdpic code will need to count symbols, and it may be useful
      elsewhere in the future too. counting is trivial as long as sysv hash
      is present, but for gnu-hash-only libraries it's complex.
      
      the behavior of the count is changed slightly: we now include symbols
      that are not accessible by the gnu hash table in the count. this may
      make dladdr slightly slower. if this is a problem, dladdr can subtract
      out the part that should not be accessible. unlike in the old code,
      subtracting this out is easy even in the fast path where sysv hash is
      available too.
      3958144e
    • R
      d8740645
  4. 18 9月, 2015 5 次提交
  5. 17 9月, 2015 2 次提交
    • R
      remove old dlstart stage-2 symbolic lookup code; add new generic · 6fc30c24
      Rich Felker 提交于
      this new generic version of the stage-2 function lookup should work
      for any arch where static data is accessible via got-relative or
      pc-relative addressing, using approximately the technique described in
      the log message for commit 2907afb8.
      
      since all the mips-like archs that need got slots fo access static
      data have already transitioned to the new stage chaining scheme, the
      old dynamic symbol lookup code is now removed.
      
      aarch64, arm, and sh have not yet transitioned; with this commit, they
      are now using the new generic code.
      6fc30c24
    • R
      introduce new symbol-lookup-free rcrt1/dlstart stage chaining · 2907afb8
      Rich Felker 提交于
      previously, the call into stage 2 was made by looking up the symbol
      name "__dls2" (which was chosen short to be easy to look up) from the
      dynamic symbol table. this was no problem for the dynamic linker,
      since it always exports all its symbols. in the case of the static pie
      entry point, however, the dynamic symbol table does not contain the
      necessary symbol unless -rdynamic/-E was used when linking. this
      linking requirement is a major obstacle both to practical use of
      static-pie as a nommu binary format (since it greatly enlarges the
      file) and to upstream toolchain support for static-pie (adding -E to
      default linking specs is not reasonable).
      
      this patch replaces the runtime symbolic lookup with a link-time
      lookup via an inline asm fragment, which reloc.h is responsible for
      providing. in this initial commit, the asm is provided only for i386,
      and the old lookup code is left in place as a fallback for archs that
      have not yet transitioned.
      
      modifying crt_arch.h to pass the stage-2 function pointer as an
      argument was considered as an alternative, but such an approach would
      not be compatible with fdpic, where it's impossible to compute
      function pointers without already having performed relocations. it was
      also deemed desirable to keep crt_arch.h as simple/minimal as
      possible.
      
      in principle, archs with pc-relative or got-relative addressing of
      static variables could instead load the stage-2 function pointer from
      a static volatile object. that does not work for fdpic, and is not
      safe against reordering on mips-like archs that use got slots even for
      static functions, but it's a valid on i386 and many others, and could
      provide a reasonable default implementation in the future.
      2907afb8
  6. 12 9月, 2015 2 次提交
    • R
      provide arch-generic fdpic self-relocation code for crt1 to use · 6d03c4ee
      Rich Felker 提交于
      this file is intended to be included by crt_arch.h on fdpic-based
      targets and needs to be called from the entry point asm.
      6d03c4ee
    • R
      make sh clone asm fdpic-compatible · 234c5846
      Rich Felker 提交于
      clone calls back to a function pointer provided by the caller, which
      will actually be a pointer to a function descriptor on fdpic. the
      obvious solution is to have a separate version of clone for fdpic, but
      I have taken a simpler approach to go around the problem. instead of
      calling the pointed-to function from asm, a direct call is made to an
      internal C function which then calls the pointed-to function. this
      lets the C compiler generate the appropriate calling convention for an
      indirect call with no need for ABI-specific assembly.
      234c5846
  7. 11 9月, 2015 1 次提交
  8. 09 9月, 2015 4 次提交
    • R
      remove unused (and invalid) C version of sigsetjmp · deb85ab4
      Rich Felker 提交于
      originally, the comment in this code was correct and it would likely
      work if the compiler generated a tail call to setjmp. however, commit
      583e5512 redesigned sigsetjmp and
      siglongjmp such that the old C implementation (which was not intended
      to be used) is not even conceptually correct. remove it in the
      interest of avoiding confusion when porting to new archs.
      deb85ab4
    • R
      fix breakage in nl_langinfo from previous commit · 58f6259d
      Rich Felker 提交于
      58f6259d
    • R
      make nl_langinfo(CODESET) always return "UTF-8" · 844212d9
      Rich Felker 提交于
      this restores the original behavior prior to the addition of the
      byte-based C locale and fixes what is effectively a regression in
      musl's property of always providing working UTF-8 support.
      
      commit 1507ebf8 introduced the codeset
      name "UTF-8-CODE-UNITS" for the byte-based C locale to represent that
      the semantic content is UTF-8 but that it is being processed as code
      units (bytes) rather than whole multibyte characters. however, many
      programs assume that the codeset name is usable with iconv and/or
      comes from a set of standard/widely-used names known to the
      application. such programs are likely to produce warnings or errors,
      run with reduced functionality, or mangle character data when run
      explicitly in the C locale.
      
      the standard places basically no requirements for the string returned
      by nl_langinfo(CODESET) and how it interacts with other interfaces, so
      returning "UTF-8" is permissible. moreover, it seems like the right
      thing to do, since the identity of the character encoding as "UTF-8"
      is independent of whether it is being processed as bytes of characters
      by the standard library functions.
      844212d9
    • R
      fix fclose of permanent (stdin/out/err) streams · 426a0e29
      Rich Felker 提交于
      this fixes a bug reported by Nuno Gonçalves. previously, calling
      fclose on stdin or stdout resulted in deadlock at exit time, since
      __stdio_exit attempts to lock these streams to flush/seek them, and
      has no easy way of knowing that they were closed.
      
      conceptually, leaving a FILE stream locked on fclose is valid since,
      in the abstract machine, it ceases to exist. but to satisfy the
      implementation-internal assumption in __stdio_exit that it can access
      these streams unconditionally, we need to unlock them.
      
      it's also necessary that fclose leaves permanent streams in a state
      where __stdio_exit will not attempt any further operations on them.
      fortunately, the call to fflush already yields this property.
      426a0e29
  9. 21 8月, 2015 1 次提交
  10. 14 8月, 2015 1 次提交
    • N
      match historical behavior for tm_gmtoff member of struct tm · c13f2af1
      Natanael Copa 提交于
      tm_gmtoff is a nonstandard field, but on historical systems which have
      this field, it stores the offset of the local time zone from GMT or
      UTC. this is the opposite of the POSIX extern long timezone object and
      the offsets used in POSIX-form TZ strings, which represent the offset
      from local time to UTC. previously we were storing these negated
      offsets in tm_gmtoff too.
      
      programs which only used this field indirectly via strftime were not
      affected since strftime performed the negation for presentation.
      however, some programs and libraries accesse tm_gmtoff directly and
      were obtaining negated time zone offsets.
      c13f2af1
  11. 10 8月, 2015 1 次提交
  12. 08 8月, 2015 1 次提交
    • R
      mitigate blow-up of heap size under malloc/free contention · c3761622
      Rich Felker 提交于
      during calls to free, any free chunks adjacent to the chunk being
      freed are momentarily held in allocated state for the purpose of
      merging, possibly leaving little or no available free memory for other
      threads to allocate. under this condition, other threads will attempt
      to expand the heap rather than waiting to use memory that will soon be
      available. the race window where this happens is normally very small,
      but became huge when free chooses to use madvise to release unused
      physical memory, causing unbounded heap size growth.
      
      this patch drastically shrinks the race window for unwanted heap
      expansion by performing madvise with the bin lock held and marking the
      bin non-empty in the binmask before making the expensive madvise
      syscall. testing by Timo Teräs has shown this approach to be a
      suitable mitigation.
      
      more invasive changes to the synchronization between malloc and free
      would be needed to completely eliminate the problem. it's not clear
      whether such changes would improve or worsen typical-case performance,
      or whether this would be a worthwhile direction to take malloc
      development.
      c3761622
  13. 25 7月, 2015 2 次提交
    • R
      fe7582f4
    • R
      fix atexit when it is called from an atexit handler · 57243b30
      Rich Felker 提交于
      The old code accepted atexit handlers after exit, but did not run them
      reliably. C11 seems to explicitly allow atexit to fail (and report
      such failure) in this case, but this situation can easily come up in
      C++ if a destructor has a local static object with a destructor so it
      should be handled.
      
      Note that the memory usage can grow linearly with the overall number
      of registered atexit handlers instead of with the worst case list
      length. (This only matters if atexit handlers keep registering atexit
      handlers which should not happen in practice).
      
      Commit message/rationale based on text by Szabolcs Nagy.
      57243b30
  14. 10 7月, 2015 2 次提交
    • R
      handle loss of syslog socket connection · 0f9c2666
      Rich Felker 提交于
      when traditional syslogd implementations are restarted, the old server
      socket ceases to exist and a new unix socket with the same pathname is
      created. when this happens, the default destination address associated
      with the client socket via connect is no longer valid, and attempts to
      send produce errors. this happens despite the socket being datagram
      type, and is in contrast to the behavior that would be seen with an IP
      datagram (UDP) socket.
      
      in order to avoid a situation where the application is unable to send
      further syslog messages without calling closelog, this patch makes
      syslog attempt to reconnect the socket when send returns an error
      indicating a lost connection.
      
      additionally, initial failure to connect the socket no longer results
      in the socket being closed. this ensures that an application which
      calls openlog to reserve the socket file descriptor will not run into
      a situation where transient connection failure (e.g. due to syslogd
      restart) prevents fd reservation. however, applications which may be
      unable to connect the socket later (e.g. due to chroot, restricted
      permissions, seccomp, etc.) will still fail to log if the syslog
      socket cannot be connected at openlog time or if it has to be
      reconnected later.
      0f9c2666
    • R
      fix incorrect void return type for syncfs function · 11894f6d
      Rich Felker 提交于
      being nonstandard, the closest thing to a specification for this
      function is its man page, which documents it as returning int. it can
      fail with EBADF if the file descriptor passed is invalid.
      11894f6d
  15. 08 7月, 2015 1 次提交
  16. 07 7月, 2015 1 次提交
  17. 28 6月, 2015 4 次提交
    • A
      dynlink.c: pass gnu-hash table pointer to gnu_lookup · 8f08a58c
      Alexander Monakov 提交于
      The callers need to check the value of the pointer anyway, so make
      them pass the pointer to gnu_lookup instead of reloading it there.
      
      Reorder gnu_lookup arguments so that always-used ones are listed
      first. GCC can choose a calling convention with arguments in registers
      (e.g. up to 3 arguments in eax, ecx, edx on x86), but cannot reorder
      the arguments for static functions.
      8f08a58c
    • A
      dynlink.c: slim down gnu_lookup · 5b4286e1
      Alexander Monakov 提交于
      Do not reference dso->syms and dso->strings until point of use.
      Check 'h1 == (h2|1)', the simplest condition, before the others.
      5b4286e1
    • A
      dynlink.c: use bloom filter in gnu hash lookup · 84389c64
      Alexander Monakov 提交于
      Introduce gnu_lookup_filtered and use it to speed up symbol lookups in
      find_sym (do_dlsym is left as is, based on an expectation that
      frequently dlsym queries will use a dlopen handle rather than
      RTLD_NEXT or RTLD_DEFAULT, and will not need to look at more than one
      DSO).
      84389c64
    • A
      dynlink.c: use a faster expression in gnu_hash · 66d45787
      Alexander Monakov 提交于
      With -Os, GCC uses a multiply rather than a shift and addition for 'h*33'.
      Use a more efficient expression explicitely.
      66d45787
  18. 26 6月, 2015 1 次提交
    • R
      fix local-dynamic model TLS on mips and powerpc · 6ba5517a
      Rich Felker 提交于
      the TLS ABI spec for mips, powerpc, and some other (presently
      unsupported) RISC archs has the return value of __tls_get_addr offset
      by +0x8000 and the result of DTPOFF relocations offset by -0x8000. I
      had previously assumed this part of the ABI was actually just an
      implementation detail, since the adjustments cancel out. however, when
      the local dynamic model is used for accessing TLS that's known to be
      in the same DSO, either of the following may happen:
      
      1. the -0x8000 offset may already be applied to the argument structure
      passed to __tls_get_addr at ld time, without any opportunity for
      runtime relocations.
      
      2. __tls_get_addr may be used with a zero offset argument to obtain a
      base address for the module's TLS, to which the caller then applies
      immediate offsets for individual objects accessed using the local
      dynamic model. since the immediate offsets have the -0x8000 adjustment
      applied to them, the base address they use needs to include the
      +0x8000 offset.
      
      it would be possible, but more complex, to store the pointers in the
      dtv[] array with the +0x8000 offset pre-applied, to avoid the runtime
      cost of adding 0x8000 on each call to __tls_get_addr. this change
      could be made later if measurements show that it would help.
      6ba5517a
  19. 23 6月, 2015 1 次提交