/* Copyright (C) 2021 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

GLIBC_2.0 {
	global:
		pthread_mutex_lock;
                pthread_mutex_unlock;
		pthread_join;
                pthread_create;
                dlopen;
                popen;
                sem_wait;
		pthread_cond_wait;		
		pthread_cond_timedwait;
                fopen;
                fclose;
                fdopen;
                fgetpos;
                fsetpos;
};

GLIBC_2.1 {
	global:
		sem_wait;		
		pthread_create;
		dlopen;
                open64;
                pread;
                pwrite;
                pwrite64;
		popen;
                fopen;
                fclose;
                fdopen;
                fgetpos64;
                fsetpos64;
};

GLIBC_2.2 {
        global:
                open64;
                posix_spawn;
                posix_spawnp;
                pread;
                pwrite;
                pwrite64;
                timer_create;
                fgetpos;
                fsetpos;
                fgetpos64;
                fsetpos64;
};

GLIBC_2.3.2 {
	global:
		pthread_cond_wait;		
		pthread_cond_timedwait;
};

GLIBC_2.15 {
        global:
		posix_spawn;
		posix_spawnp;
};
