libc {
  GLIBC_2.0 {
    pthread_attr_destroy; pthread_attr_init;
    pthread_attr_getdetachstate; pthread_attr_setdetachstate;
    pthread_attr_getinheritsched; pthread_attr_setinheritsched;
    pthread_attr_getschedparam; pthread_attr_setschedparam;
    pthread_attr_getschedpolicy;  pthread_attr_setschedpolicy;
    pthread_attr_getscope; pthread_attr_setscope;
    pthread_condattr_destroy; pthread_condattr_init;
    pthread_cond_broadcast; pthread_cond_destroy;
    pthread_cond_init; pthread_cond_signal; pthread_cond_wait;
    pthread_cond_timedwait;
    pthread_equal; pthread_exit;
    pthread_getschedparam; pthread_setschedparam;
    pthread_mutex_destroy; pthread_mutex_init;
    pthread_mutex_lock; pthread_mutex_unlock;
    pthread_self;
    pthread_setcancelstate; pthread_setcanceltype;
  }
  GLIBC_2.1 {
    pthread_attr_init;
  }
  GLIBC_2.3.2 {
    __register_atfork;

    # Changed pthread_cond_t.
    pthread_cond_init; pthread_cond_destroy;
    pthread_cond_wait; pthread_cond_signal;
    pthread_cond_broadcast; pthread_cond_timedwait;
  }
  GLIBC_PRIVATE {
    __libc_alloca_cutoff;
    # Internal libc interface to libpthread
    __libc_dl_error_tsd;
    __libc_vfork;
    __libc_pthread_init;
    __libc_current_sigrtmin_private; __libc_current_sigrtmax_private;
    __libc_allocate_rtsig_private;
  }
}

libpthread {
  GLIBC_2.0 {
    pthread_create; pthread_join; pthread_self; pthread_equal;
    pthread_exit; pthread_detach;

    pthread_getschedparam; pthread_setschedparam;

    pthread_attr_init; pthread_attr_destroy;
    pthread_attr_getdetachstate; pthread_attr_setdetachstate;
    pthread_attr_getschedparam; pthread_attr_setschedparam;
    pthread_attr_getschedpolicy; pthread_attr_setschedpolicy;
    pthread_attr_getinheritsched; pthread_attr_setinheritsched;
    pthread_attr_getscope; pthread_attr_setscope;

    pthread_mutex_init; pthread_mutex_destroy;
    pthread_mutex_lock; pthread_mutex_trylock; pthread_mutex_unlock;

    pthread_mutexattr_init; pthread_mutexattr_destroy;

    pthread_cond_init; pthread_cond_destroy;
    pthread_cond_wait; pthread_cond_timedwait;
    pthread_cond_signal; pthread_cond_broadcast;

    pthread_condattr_destroy; pthread_condattr_init;

    pthread_cancel; pthread_testcancel;
    pthread_setcancelstate; pthread_setcanceltype;

    pthread_sigmask; pthread_kill;

    pthread_key_create; pthread_key_delete;
    pthread_getspecific; pthread_setspecific;

    pthread_once;

    pthread_atfork;

    flockfile; funlockfile; ftrylockfile;

    # Non-standard POSIX1.x functions.
    pthread_mutexattr_getkind_np; pthread_mutexattr_setkind_np;

    # Protected names for functions used in other shared objects.
    __pthread_mutex_init; __pthread_mutex_destroy;
    __pthread_mutex_lock; __pthread_mutex_trylock; __pthread_mutex_unlock;
    __pthread_mutexattr_init; __pthread_mutexattr_destroy;
    __pthread_mutexattr_settype;
    __pthread_key_create; __pthread_getspecific; __pthread_setspecific;
    __pthread_once; __pthread_atfork;
    _IO_flockfile; _IO_ftrylockfile; _IO_funlockfile;

    # Semaphores.
    sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;

    # Special fork handling.
    fork; __fork; vfork;

    # Cancellation points.
    close; __close; fcntl; __fcntl; read; __read; write; __write; accept;
    connect; __connect; recv; recvfrom; recvmsg; send; __send; sendmsg; sendto;
    fsync; lseek; __lseek; msync; nanosleep; open; __open; pause; tcdrain;
    system; wait; __wait; waitpid;

    # Hidden entry point (through macros).
    _pthread_cleanup_push; _pthread_cleanup_pop;
    _pthread_cleanup_push_defer; _pthread_cleanup_pop_restore;

    pthread_kill_other_threads_np;

    # The error functions.
    __errno_location; __h_errno_location;

    # Functions which previously have been overwritten.
    sigwait; sigaction; __sigaction; _exit; _Exit; longjmp; siglongjmp;
    raise;
  }

  GLIBC_2.1 {
    pthread_create;
    pthread_attr_init;

    pthread_attr_getguardsize; pthread_attr_setguardsize;
    pthread_attr_getstackaddr; pthread_attr_setstackaddr;
    pthread_attr_getstacksize; pthread_attr_setstacksize;

    pthread_mutexattr_gettype; pthread_mutexattr_settype;

    pthread_rwlock_init; pthread_rwlock_destroy;
    pthread_rwlock_rdlock; pthread_rwlock_wrlock; pthread_rwlock_unlock;
    pthread_rwlock_tryrdlock; pthread_rwlock_trywrlock;

    pthread_rwlockattr_init; pthread_rwlockattr_destroy;
    pthread_rwlockattr_getpshared; pthread_rwlockattr_setpshared;
    pthread_rwlockattr_getkind_np; pthread_rwlockattr_setkind_np;

    pthread_getconcurrency; pthread_setconcurrency;

    # Semaphores.
    sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait;

    __libc_current_sigrtmin; __libc_current_sigrtmax;
    __libc_allocate_rtsig;
  }

  GLIBC_2.1.1 {
    sem_close; sem_open; sem_unlink;
  }

  GLIBC_2.1.2 {
    __vfork;
  }

  GLIBC_2.2 {
    pthread_mutexattr_getpshared; pthread_mutexattr_setpshared;

    pthread_condattr_getpshared; pthread_condattr_setpshared;

    # New functions from IEEE Std. 1003.1-2001.
    pthread_mutex_timedlock;

    pthread_rwlock_timedrdlock; pthread_rwlock_timedwrlock;

    pthread_attr_getstack; pthread_attr_setstack;

    pthread_spin_destroy; pthread_spin_init; pthread_spin_lock;
    pthread_spin_trylock; pthread_spin_unlock;

    pthread_barrier_init; pthread_barrier_destroy; pthread_barrier_wait;
    pthread_barrierattr_destroy; pthread_barrierattr_init;
    pthread_barrierattr_setpshared;

    sem_timedwait;

    pthread_yield;

    pthread_getcpuclockid;

    # Cancellation points.
    lseek64; open64; __open64; pread; pread64; __pread64; pwrite; pwrite64;
    __pwrite64;

    # Names used internally.
    __pthread_rwlock_init; __pthread_rwlock_destroy;
    __pthread_rwlock_rdlock; __pthread_rwlock_tryrdlock;
    __pthread_rwlock_wrlock; __pthread_rwlock_trywrlock;
    __pthread_rwlock_unlock;

    __res_state;
  }

  GLIBC_2.2.3 {
    # Extensions.
    pthread_getattr_np;
  }

  GLIBC_2.2.6 {
    # Cancellation wrapper
    __nanosleep;
  }

  GLIBC_2.3.2 {
    # Changed pthread_cond_t.
    pthread_cond_init; pthread_cond_destroy;
    pthread_cond_wait; pthread_cond_timedwait;
    pthread_cond_signal; pthread_cond_broadcast;
  }

  GLIBC_2.3.3 {
    # 1003.1-2001 function accidentally left out in 2.2.
    pthread_barrierattr_getpshared;

    # Unix CS option.
    pthread_condattr_getclock; pthread_condattr_setclock;

    # Proposed API extensions.
    pthread_tryjoin_np; pthread_timedjoin_np;

    # New cancellation cleanup handling.
    __pthread_register_cancel; __pthread_unregister_cancel;
    __pthread_register_cancel_defer; __pthread_unregister_cancel_restore;
    __pthread_unwind_next;
    __pthread_cleanup_routine;

    # affinity interfaces without size parameter
    pthread_getaffinity_np; pthread_setaffinity_np;
    pthread_attr_getaffinity_np; pthread_attr_setaffinity_np;
  }

  GLIBC_2.3.4 {
    # New affinity interfaces.
    pthread_getaffinity_np; pthread_setaffinity_np;
    pthread_attr_getaffinity_np; pthread_attr_setaffinity_np;

    pthread_setschedprio;
  }

  GLIBC_2.4 {
    pthread_mutexattr_getrobust_np; pthread_mutexattr_setrobust_np;
    pthread_mutex_consistent_np;
    pthread_mutexattr_getprotocol; pthread_mutexattr_setprotocol;
    pthread_mutexattr_getprioceiling; pthread_mutexattr_setprioceiling;
    pthread_mutex_getprioceiling; pthread_mutex_setprioceiling;
  };

  GLIBC_2.11 {
    pthread_sigqueue;
  };

  GLIBC_2.12 {
    pthread_mutex_consistent; pthread_mutexattr_getrobust;
    pthread_mutexattr_setrobust;

    pthread_setname_np; pthread_getname_np;
  };

  GLIBC_2.18 {
    pthread_getattr_default_np;
    pthread_setattr_default_np;
  }

  GLIBC_2.20 {
  }

  GLIBC_2.22 {
  }

  GLIBC_PRIVATE {
    __pthread_initialize_minimal;
    __pthread_clock_gettime; __pthread_clock_settime;
    __pthread_unwind; __pthread_get_minstack;
    __pthread_barrier_init; __pthread_barrier_wait;
    __shm_directory;
  }
}