/* Load a shared object at runtime, relocate it, and run its initializer. Copyright (C) 1996-2019 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */#include<assert.h>#include<dlfcn.h>#include<errno.h>#include<libintl.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/mman.h> /* Check whether MAP_COPY is defined. */#include<sys/param.h>#include<libc-lock.h>#include<ldsodefs.h>#include<sysdep-cancel.h>#include<tls.h>#include<stap-probe.h>#include<atomic.h>#include<libc-internal.h>#include<array_length.h>#include<internal-signals.h>#include<dl-dst.h>#include<dl-prop.h>/* We must be careful not to leave us in an inconsistent state. Thus we catch any error and re-raise it after cleaning up. */structdl_open_args{constchar*file;intmode;/* This is the caller of the dlopen() function. */constvoid*caller_dlopen;structlink_map*map;/* Namespace ID. */Lmid_tnsid;/* Original signal mask. Used for unblocking signal handlers before running ELF constructors. */