/* 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. */ #ifndef _COLLECT_H #define _COLLECT_H #include extern "C" { typedef void (*SignalHandler)(int); } class Coll_Ctrl; class Elf; #define MAXLABELS 10 /* maximum number of -C arguments */ #define STDEBUFSIZE 24000 enum { MAX_LD_PRELOAD_TYPES = 3 }; struct Process { Process (pid_t _pid) : pid (_pid) { } pid_t pid; }; struct DtraceTool { DtraceTool (char*); ~DtraceTool (); char *name; // Tool name as specified by -D flag char *params; // Tool parameters char *dfile; // Extracted d-script char *mfile; // Extracted metadata file char *ofile; // Output file pid_t pid; }; // collect object class collect : Application { public: collect (int argc, char *argv[], char **envp); virtual ~collect (); void start (int argc, char *argv[]); void writeStr (int f, const char *buf); // the collector control class Coll_Ctrl *cc; private: enum Exec_status { EXEC_OK = 0, // found as runnable executable EXEC_ELF_NOSHARE, // found, but built unshared EXEC_IS_JAR, // found as a .jar file EXEC_IS_CLASS, // found as a .class file but name missing .class EXEC_IS_CLASSCLASS, // found as a .class file with explicit .class EXEC_OPEN_FAIL, // could not be opened EXEC_ELF_LIB, // internal error: bad elf library EXEC_ELF_HEADER, // executable, with bad ELF header EXEC_ELF_ARCH, // executable, but unrunnable architecture EXEC_ISDIR, // a directory, not a file EXEC_NOT_EXEC, // a file, but not executable EXEC_NOT_FOUND // a directory, not a file }; // override methods in base class void usage (); void short_usage (); void show_hwc_usage (); int check_args (int argc, char *argv[]); void check_target (int, char **); Exec_status check_executable (char *); Exec_status check_executable_arch (Elf *); char *status_str (Exec_status, char *); int do_flag (const char *); char *find_java (void); char *java_path; char *java_how; int putenv_libcollector (); int putenv_libcollector_ld_audits (); int putenv_libcollector_ld_preloads (); int putenv_libcollector_ld_misc (); void add_ld_preload (const char *lib); int putenv_ld_preloads (); int putenv_memso (); int env_strip (char *env, const char *str); int putenv_purged_ld_preloads (const char *var); int putenv_append (const char *var, const char *val); void get_count_data (); void prepare_dbx (); int traceme (const char *file, char *const argv[]); int checkflagterm (const char *); void dupflagseen (char); void dupflagseen (const char *); void validate_config (int); void validate_java (const char *, const char *, int); int set_output (); void reset_output (); /* Logging warning messages */ char **collect_warnings; int collect_warnings_idx; void warn_open (); void warn_close (); void warn_write (const char *format, ...); void warn_comment (const char *kind, int num, char *s = NULL, int len = 0); char *warnfilename; FILE *warn_file; /* MPI experiment handling */ void setup_MPI_expt (); /* the founder experiment */ void write_MPI_founder_log (); void close_MPI_founder_log (int, int); void spawn_MPI_job (); /* run the MPI job */ void copy_collect_args (char ***); /* copy collect args for an MPI target */ int disabled; int jseen_global; /* if -j flag was seen */ int verbose; bool mem_so_me; /* if T, preload mem.so, not libcollector */ int origargc; char **arglist; char **origargv; char **origenvp; int targ_index; // index of name of target in origargv bool is_64; int nargs; int njargs; char *jargs; int nlabels; char *label[MAXLABELS]; char *sp_preload_list[MAX_LD_PRELOAD_TYPES + 1]; // +1 for NULL termination char *sp_libpath_list[MAX_LD_PRELOAD_TYPES + 1]; // +1 for NULL termination }; #endif /* ! _COLLECT_H */