From 26b486d5c5cb78959f1e175b060cd141f0490704 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 22 Feb 2021 16:26:01 +0000 Subject: [PATCH] 9.61: More note checking improvements --- annobin-global.h | 2 +- annocheck/hardened.c | 219 +++++++++------- annocheck/notes.c | 26 +- autom4te.cache/requests | 528 +++++++++++++++++++-------------------- clang-plugin/Makefile.in | 4 +- tests/Makefile.am | 1 + tests/Makefile.in | 14 +- tests/glibc-notes-test | 42 ++++ 8 files changed, 465 insertions(+), 371 deletions(-) create mode 100755 tests/glibc-notes-test diff --git a/annobin-global.h b/annobin-global.h index 15cdd83..b51677b 100644 --- a/annobin-global.h +++ b/annobin-global.h @@ -19,7 +19,7 @@ extern "C" { /* The version of the package. NB/ This number is expected to be in the form "Nnn" where "N" is major version number and "nn" is the minor version number. */ -#define ANNOBIN_VERSION 960 +#define ANNOBIN_VERSION 961 /* The version of the annotation specification supported. */ #define SPEC_VERSION 3 diff --git a/annocheck/hardened.c b/annocheck/hardened.c index 82b116c..66a2ed3 100644 --- a/annocheck/hardened.c +++ b/annocheck/hardened.c @@ -872,62 +872,54 @@ parse_dw_at_producer (annocheck_data * data, Dwarf_Attribute * attr) options. Note - this is suboptimal since these options do not necessarily apply to the entire binary, but in the absence of annobin data they are better than nothing. */ - switch (madeby) - { - default: - break; - - case TOOL_CLANG: - /* Try to determine if there are any command line options recorded in the - DW_AT_producer string. FIXME: This is not a very good heuristic. */ - if (strstr (string, "-f") || strstr (string, "-g") || strstr (string, "-O")) - { - if (strstr (string, " -O2") || strstr (string, " -O3")) - pass (data, TEST_OPTIMIZATION, SOURCE_DW_AT_PRODUCER, NULL); - else if (strstr (string, " -O0") || strstr (string, " -O1")) - /* FIXME: This may not be a failure. GCC needs -O2 or - better for -D_FORTIFY_SOURCE to work properly, but - other compilers may not. */ - fail (data, TEST_OPTIMIZATION, SOURCE_DW_AT_PRODUCER, "optimization level too low"); - else - info (data, TEST_OPTIMIZATION, SOURCE_DW_AT_PRODUCER, "not found in string"); - if (strstr (string, " -fpic") || strstr (string, " -fPIC") - || strstr (string, " -fpie") || strstr (string, " -fPIE")) - pass (data, TEST_PIC, SOURCE_DW_AT_PRODUCER, NULL); - else - info (data, TEST_PIC, SOURCE_DW_AT_PRODUCER, "-fpic/-fpie not found in string"); + /* Try to determine if there are any command line options recorded in the + DW_AT_producer string. FIXME: This is not a very good heuristic. */ + if (strstr (string, "-f") || strstr (string, "-g") || strstr (string, "-O")) + { + if (strstr (string, " -O2") || strstr (string, " -O3")) + pass (data, TEST_OPTIMIZATION, SOURCE_DW_AT_PRODUCER, NULL); + else if (strstr (string, " -O0") || strstr (string, " -O1")) + /* FIXME: This may not be a failure. GCC needs -O2 or + better for -D_FORTIFY_SOURCE to work properly, but + other compilers may not. */ + fail (data, TEST_OPTIMIZATION, SOURCE_DW_AT_PRODUCER, "optimization level too low"); + else + info (data, TEST_OPTIMIZATION, SOURCE_DW_AT_PRODUCER, "not found in string"); - if (strstr (string, "-fstack-protector-strong") - || strstr (string, "-fstack-protector-all")) - pass (data, TEST_STACK_PROT, SOURCE_DW_AT_PRODUCER, NULL); - else if (strstr (string, "-fstack-protector")) - fail (data, TEST_STACK_PROT, SOURCE_DW_AT_PRODUCER, "insufficient protection enabled"); - else - info (data, TEST_STACK_PROT, SOURCE_DW_AT_PRODUCER, "not found in string"); + if (strstr (string, " -fpic") || strstr (string, " -fPIC") + || strstr (string, " -fpie") || strstr (string, " -fPIE")) + pass (data, TEST_PIC, SOURCE_DW_AT_PRODUCER, NULL); + else + info (data, TEST_PIC, SOURCE_DW_AT_PRODUCER, "-fpic/-fpie not found in string"); - if (strstr (string, "-Wall") - || strstr (string, "-Wformat-security") - || strstr (string, "-Werror=format-security")) - pass (data, TEST_WARNINGS, SOURCE_DW_AT_PRODUCER, NULL); - else - info (data, TEST_WARNINGS, SOURCE_DW_AT_PRODUCER, "not found in string"); + if (strstr (string, "-fstack-protector-strong") + || strstr (string, "-fstack-protector-all")) + pass (data, TEST_STACK_PROT, SOURCE_DW_AT_PRODUCER, NULL); + else if (strstr (string, "-fstack-protector")) + fail (data, TEST_STACK_PROT, SOURCE_DW_AT_PRODUCER, "insufficient protection enabled"); + else + info (data, TEST_STACK_PROT, SOURCE_DW_AT_PRODUCER, "not found in string"); - if (is_x86 ()) - { - if (strstr (string, "-fcf-protection")) - pass (data, TEST_CF_PROTECTION, SOURCE_DW_AT_PRODUCER, NULL); - else - info (data, TEST_CF_PROTECTION, SOURCE_DW_AT_PRODUCER, "not found in string"); - } - } - else if (! per_file.warned_command_line) + if (strstr (string, "-Wall") + || strstr (string, "-Wformat-security") + || strstr (string, "-Werror=format-security")) + pass (data, TEST_WARNINGS, SOURCE_DW_AT_PRODUCER, NULL); + else + info (data, TEST_WARNINGS, SOURCE_DW_AT_PRODUCER, "not found in string"); + + if (is_x86 ()) { - warn (data, "Command line options not recorded by -grecord-gcc-switches"); - per_file.warned_command_line = true; + if (strstr (string, "-fcf-protection")) + pass (data, TEST_CF_PROTECTION, SOURCE_DW_AT_PRODUCER, NULL); + else + info (data, TEST_CF_PROTECTION, SOURCE_DW_AT_PRODUCER, "not found in string"); } - - break; + } + else if (BE_VERBOSE && ! per_file.warned_command_line) + { + warn (data, "Command line options not recorded by -grecord-gcc-switches"); + per_file.warned_command_line = true; } } @@ -1203,6 +1195,27 @@ report_note_producer (annocheck_data * data, einfo (PARTIAL, "version %u\n", version); } +static const char * +note_name (const char * attr) +{ + if (isprint (* attr)) + return attr; + + switch (* attr) + { + case GNU_BUILD_ATTRIBUTE_VERSION: return "Version"; + case GNU_BUILD_ATTRIBUTE_TOOL: return "Tool"; + case GNU_BUILD_ATTRIBUTE_RELRO: return "Relro"; + case GNU_BUILD_ATTRIBUTE_ABI: return "ABI"; + case GNU_BUILD_ATTRIBUTE_STACK_SIZE: return "StackSize"; + case GNU_BUILD_ATTRIBUTE_PIC: return "PIC"; + case GNU_BUILD_ATTRIBUTE_STACK_PROT: return "StackProt"; + case GNU_BUILD_ATTRIBUTE_SHORT_ENUM: return "Enum"; + default: return ""; + } + +} + static bool build_note_checker (annocheck_data * data, annocheck_section * sec, @@ -1301,6 +1314,12 @@ build_note_checker (annocheck_data * data, } } + if (end == (ulong) -1) + { + einfo (WARN, "%s: Corrupt annobin note : end address == -1", data->filename); + start = end; + } + if (! is_object_file () && ! ignore_gaps) { /* Notes can occur in any order and may be spread across multiple note @@ -1327,25 +1346,21 @@ build_note_checker (annocheck_data * data, } } + const char * namedata = sec->data->d_buf + name_offset; + uint pos = (namedata[0] == 'G' ? 3 : 1); + char attr_type = namedata[pos - 1]; + const char * attr = namedata + pos; + /* We skip notes with empty ranges unless we are dealing with unrelocated object files. */ if (! is_object_file () && note_data->start == note_data->end) { - static ulong last_reported_addr = 0; - if (note_data->start != last_reported_addr) - { - einfo (VERBOSE2, "skip notes for zero-length range at %#lx", note_data->start); - last_reported_addr = note_data->start; - } + einfo (VERBOSE2, "skip %s note for zero-length range at %#lx", + note_name (attr), note_data->start); return true; } - const char * namedata = sec->data->d_buf + name_offset; - uint pos = (namedata[0] == 'G' ? 3 : 1); - char attr_type = namedata[pos - 1]; - const char * attr = namedata + pos; - /* Advance pos to the attribute's value. */ if (! isprint (* attr)) pos ++; @@ -1390,6 +1405,8 @@ build_note_checker (annocheck_data * data, return true; } + einfo (VERBOSE2, "process %s note for range at %#lx..%#lx", + note_name (attr), note_data->start, note_data->end); switch (* attr) { case GNU_BUILD_ATTRIBUTE_VERSION: @@ -1408,7 +1425,7 @@ build_note_checker (annocheck_data * data, } if (* attr > '0' + SPEC_VERSION) - einfo (WARN, "%s: This checker only supports version %d of the Watermark protocol. The data in the notes uses version %d", + einfo (INFO, "%s: WARN: This checker only supports version %d of the Watermark protocol. The data in the notes uses version %d", data->filename, SPEC_VERSION, * attr - '0'); /* Check the note per_file. */ @@ -1528,7 +1545,7 @@ build_note_checker (annocheck_data * data, } else if (per_file.run_major != major) { - einfo (WARN, "%s: this file was built by more than one version of %s (%u and %u)", + einfo (INFO, "%s: WARN: this file was built by more than one version of %s (%u and %u)", data->filename, t->tool_name, per_file.run_major, major); if (per_file.run_major < major) per_file.run_major = major; @@ -1538,7 +1555,7 @@ build_note_checker (annocheck_data * data, { if (! per_file.warned_version_mismatch) { - einfo (INFO, "%s: ICE: Annobin plugin was built by %s version %u but run on %s version %u", + einfo (INFO, "%s: WARN: Annobin plugin was built by %s version %u but run on %s version %u", data->filename, t->tool_name, per_file.anno_major, t->tool_name, per_file.run_major); per_file.warned_version_mismatch = true; @@ -1594,7 +1611,7 @@ build_note_checker (annocheck_data * data, } else if (per_file.anno_major != major) { - einfo (WARN, "%s: notes produced by annobins compiled for more than one version of %s (%u vs %u)", + einfo (INFO, "%s: WARN: notes produced by annobins compiled for more than one version of %s (%u vs %u)", data->filename, t->tool_name, per_file.anno_major, major); if (per_file.anno_major < major) per_file.anno_major = major; @@ -1604,7 +1621,7 @@ build_note_checker (annocheck_data * data, { if (! per_file.warned_version_mismatch) { - einfo (INFO, "%s: ICE: Annobin plugin was built by %s version %u but run on %s version %u", + einfo (INFO, "%s: WARN: Annobin plugin was built by %s version %u but run on %s version %u", data->filename, t->tool_name, per_file.anno_major, t->tool_name, per_file.run_major); per_file.warned_version_mismatch = true; } @@ -1674,6 +1691,7 @@ build_note_checker (annocheck_data * data, break; case GNU_BUILD_ATTRIBUTE_STACK_PROT: +einfo (VERBOSE2, "STACK PROT %d", value); if (skip_check (TEST_STACK_PROT)) break; @@ -2066,7 +2084,7 @@ build_note_checker (annocheck_data * data, if (skip_check (TEST_STACK_CLASH)) break; - if (! includes_gcc (per_file.current_tool)) + if (! includes_gcc (per_file.current_tool) && ! includes_gimple (per_file.current_tool)) { skip (data, TEST_STACK_CLASH, SOURCE_ANNOBIN_NOTES, "not compiled by gcc"); break; @@ -2102,7 +2120,7 @@ build_note_checker (annocheck_data * data, if (skip_check (TEST_STACK_REALIGN)) break; - if (! includes_gcc (per_file.current_tool)) + if (! includes_gcc (per_file.current_tool) && ! includes_gimple (per_file.current_tool)) { skip (data, TEST_STACK_REALIGN, SOURCE_ANNOBIN_NOTES, "Not built by gcc"); break; @@ -2416,7 +2434,7 @@ check_note_section (annocheck_data * data, { if (sec->shdr.sh_addralign != 4 && sec->shdr.sh_addralign != 8) { - einfo (WARN, "%s: note section %s not properly aligned (alignment: %ld)", + einfo (INFO, "%s: WARN: note section %s not properly aligned (alignment: %ld)", data->filename, sec->secname, (long) sec->shdr.sh_addralign); } @@ -2581,18 +2599,18 @@ check_dynamic_section (annocheck_data * data, if (dynamic_relocs_seen && tests[TEST_BIND_NOW].state != STATE_PASSED) { if (! is_executable ()) - skip (data, TEST_BIND_NOW, SOURCE_DYNAMIC_SECTION, "Not an executable"); + skip (data, TEST_BIND_NOW, SOURCE_DYNAMIC_SECTION, "not an executable"); else if (per_file.seen_tools & TOOL_GO) /* FIXME: Should be changed once GO supports PIE & BIND_NOW. */ - skip (data, TEST_BIND_NOW, SOURCE_DYNAMIC_SECTION, "Binary was built by GO"); + skip (data, TEST_BIND_NOW, SOURCE_DYNAMIC_SECTION, "binary was built by GO"); else - fail (data, TEST_BIND_NOW, SOURCE_DYNAMIC_SECTION, "Not linked with -Wl,-z,now"); + fail (data, TEST_BIND_NOW, SOURCE_DYNAMIC_SECTION, "not linked with -Wl,-z,now"); } if (per_file.e_machine == EM_AARCH64) { if (is_object_file ()) - skip (data, TEST_DYNAMIC_TAGS, SOURCE_DYNAMIC_SECTION, "Not needed in object files"); + skip (data, TEST_DYNAMIC_TAGS, SOURCE_DYNAMIC_SECTION, "not needed in object files"); else { uint res = aarch64_bti_plt_seen ? 1 : 0; @@ -2694,6 +2712,13 @@ check_sec (annocheck_data * data, } } +static bool +is_shared_lib (annocheck_data * data) +{ + /* FIXME: Need a better test. */ + return strstr (data->filename, ".so") != NULL; +} + static bool interesting_seg (annocheck_data * data, annocheck_segment * seg) @@ -2714,13 +2739,6 @@ interesting_seg (annocheck_data * data, switch (seg->phdr->p_type) { -#if 0 - case PT_INTERP: - /* Signal the code in check_seg() that this is interpreted code. */ - tests[TEST_ENTRY].state = STATE_MAYBE; - skip (data, TEST_ENTRY, SOURCE_SEGMENT_HEADERS, "interpreted code"); - break; -#endif case PT_GNU_RELRO: pass (data, TEST_GNU_RELRO, SOURCE_SEGMENT_HEADERS, NULL); break; @@ -2755,6 +2773,7 @@ interesting_seg (annocheck_data * data, do not have to have sections. */ if (per_file.e_type == ET_DYN && is_x86 () + && ! is_shared_lib (data) && seg->phdr->p_memsz > 0 && seg->phdr->p_vaddr <= per_file.e_entry && seg->phdr->p_vaddr + seg->phdr->p_memsz > per_file.e_entry @@ -3206,13 +3225,13 @@ check_for_gaps (annocheck_data * data) sym = cpsym; } - einfo (VERBOSE, "%s: gap: (%lx..%lx probable component: %s) in annobin notes", + einfo (VERBOSE, "%s: gap: (%#lx..%#lx probable component: %s) in annobin notes", data->filename, gap.start, gap.end, sym); free ((char *) cpsym); } else - einfo (VERBOSE, "%s: gap: (%lx..%lx) in annobin notes", + einfo (VERBOSE, "%s: gap: (%#lx..%#lx) in annobin notes", data->filename, gap.start, gap.end); } } @@ -3375,7 +3394,7 @@ finish (annocheck_data * data) /* FIXME: This is for GO binaries. Should be changed once GO supports PIE & BIND_NOW. */ skip (data, i, SOURCE_FINAL_SCAN, "built by GO"); else - fail (data, i, SOURCE_FINAL_SCAN, "Not linked with -Wl,-z,relro"); + fail (data, i, SOURCE_FINAL_SCAN, "not linked with -Wl,-z,relro"); break; case TEST_DYNAMIC_TAGS: @@ -3426,22 +3445,28 @@ finish (annocheck_data * data) case TEST_PIC: if (per_file.current_tool == TOOL_GO) skip (data, i, SOURCE_FINAL_SCAN, "GO does not support a -fPIC option"); - else + else if (is_C_compiler (per_file.seen_tools)) maybe (data, i, SOURCE_FINAL_SCAN, "no valid notes found regarding this test"); + else + skip (data, i, SOURCE_FINAL_SCAN, "not compiled code"); break; case TEST_STACK_PROT: if (per_file.current_tool == TOOL_GO) skip (data, i, SOURCE_FINAL_SCAN, "GO is stack safe"); - else + else if (is_C_compiler (per_file.seen_tools)) maybe (data, i, SOURCE_FINAL_SCAN, "no valid notes found regarding this test"); + else + skip (data, i, SOURCE_FINAL_SCAN, "not compiled code"); break; case TEST_OPTIMIZATION: if (per_file.current_tool == TOOL_GO) skip (data, i, SOURCE_FINAL_SCAN, "GO optimizes by default"); - else + else if (is_C_compiler (per_file.seen_tools)) maybe (data, i, SOURCE_FINAL_SCAN, "no valid notes found regarding this test"); + else + skip (data, i, SOURCE_FINAL_SCAN, "not compiled code"); break; case TEST_STACK_CLASH: @@ -3452,6 +3477,8 @@ finish (annocheck_data * data) skip (data, i, SOURCE_FINAL_SCAN, "no compiled code found"); else if (per_file.current_tool == TOOL_GO) skip (data, i, SOURCE_FINAL_SCAN, "GO is stack safe"); + else if (is_C_compiler (per_file.seen_tools)) + skip (data, i, SOURCE_FINAL_SCAN, "no compiled code found"); else maybe (data, i, SOURCE_FINAL_SCAN, "no notes found regarding this test"); break; @@ -3461,6 +3488,8 @@ finish (annocheck_data * data) skip (data, i, SOURCE_FINAL_SCAN, "property notes not used"); else if (is_object_file ()) skip (data, i, SOURCE_FINAL_SCAN, "property notes not needed in object files"); + else if (per_file.current_tool == TOOL_GO) + skip (data, i, SOURCE_FINAL_SCAN, "property notes not needed for GO binaries"); else if (per_file.e_machine == EM_AARCH64) future_fail (data, ".note.gnu.property section not found"); else @@ -3470,7 +3499,9 @@ finish (annocheck_data * data) case TEST_CF_PROTECTION: if (is_x86 () && is_executable ()) { - if (tests[TEST_PROPERTY_NOTE].enabled + if (per_file.current_tool == TOOL_GO) + skip (data, i, SOURCE_FINAL_SCAN, "control flow protection is not needed for GO binaries"); + else if (tests[TEST_PROPERTY_NOTE].enabled && tests[TEST_PROPERTY_NOTE].state == STATE_UNTESTED) fail (data, i, SOURCE_FINAL_SCAN, "no .note.gnu.property section = no control flow information"); else @@ -3493,7 +3524,7 @@ finish (annocheck_data * data) case TEST_BRANCH_PROTECTION: if (per_file.e_machine != EM_AARCH64) skip (data, i, SOURCE_FINAL_SCAN, "not an AArch64 binary"); - else if (! includes_gcc (per_file.seen_tools)) + else if (! includes_gcc (per_file.seen_tools) && ! includes_gimple (per_file.current_tool)) skip (data, i, SOURCE_FINAL_SCAN, "not built by gcc"); else if (per_file.tool_version < 9) skip (data, i, SOURCE_FINAL_SCAN, "needs gcc 9+"); @@ -3506,19 +3537,19 @@ finish (annocheck_data * data) case TEST_GO_REVISION: if (per_file.seen_tools & TOOL_GO) - fail (data, i, SOURCE_FINAL_SCAN, "No Go compiler revision information found"); + fail (data, i, SOURCE_FINAL_SCAN, "no Go compiler revision information found"); else - skip (data, i, SOURCE_FINAL_SCAN, "No GO compiled code found"); + skip (data, i, SOURCE_FINAL_SCAN, "no GO compiled code found"); case TEST_ONLY_GO: if (! is_x86 ()) - skip (data, i, SOURCE_FINAL_SCAN, "Not compiled for x86"); + skip (data, i, SOURCE_FINAL_SCAN, "not compiled for x86"); else if (per_file.seen_tools == TOOL_GO) - pass (data, i, SOURCE_FINAL_SCAN, "Only GO compiled code found"); + pass (data, i, SOURCE_FINAL_SCAN, "only GO compiled code found"); else if (per_file.seen_tools & TOOL_GO) - fail (data, i, SOURCE_FINAL_SCAN, "Mixed GO and another language found"); + fail (data, i, SOURCE_FINAL_SCAN, "mixed GO and another language found"); else - skip (data, i, SOURCE_FINAL_SCAN, "No GO compiled code found"); + skip (data, i, SOURCE_FINAL_SCAN, "no GO compiled code found"); break; } } diff --git a/annocheck/notes.c b/annocheck/notes.c index fa5af31..0af5861 100644 --- a/annocheck/notes.c +++ b/annocheck/notes.c @@ -21,11 +21,11 @@ typedef struct local_note { - ulong start; - ulong end; - uint value; - bool open; - const char * data; + ulong start; + ulong end; + uint value; + const char * data; + bool open; } local_note; @@ -101,6 +101,7 @@ record_note (uint value, const char * data, bool open) note->value = value; note->open = open; note->data = data; + ++ num_saved_notes; } @@ -286,7 +287,15 @@ compare_range (const void * r1, const void * r2) if (n1->end > n2->end) return 1; + if (n1->end < n2->end) + return -1; + /* Put open notes before function notes. */ + if (n1->open && ! n2->open) + return -1; + if (! n1->open && n2->open) + return 1; +#if 0 /* N1 is wholly covered by N2: n2->start <= n1->start <= n2->end n2->start <= n1->end <= n2->end. @@ -294,12 +303,15 @@ compare_range (const void * r1, const void * r2) n1->start = n2->start; n1->end = n2->end; assert (n1->start <= n1->end); +#endif return 0; } static bool notes_end_file (annocheck_data * data) { + uint i; + if (disabled) return true; @@ -310,7 +322,7 @@ notes_end_file (annocheck_data * data) qsort (saved_notes, num_saved_notes, sizeof saved_notes[0], compare_range); /* Display the saved notes. */ - uint i; + ulong prev_start = 0, prev_end = 0; for (i = 0; i < num_saved_notes; i++) { @@ -320,7 +332,7 @@ notes_end_file (annocheck_data * data) if (note->start == note->end && ! BE_VERBOSE && e_type != ET_REL) continue; - if (note->start != prev_start || note->end != prev_end) + if (i == 0 || note->start != prev_start || note->end != prev_end) { einfo (INFO, "Range: %#lx .. %#lx", note->start, note->end); prev_start = note->start; diff --git a/autom4te.cache/requests b/autom4te.cache/requests index 73aa1b7..cf5cd46 100644 --- a/autom4te.cache/requests +++ b/autom4te.cache/requests @@ -16,63 +16,63 @@ 'configure.ac' ], { + '_LT_AC_TAGCONFIG' => 1, + 'AC_FC_FREEFORM' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + '_AM_COND_IF' => 1, + 'AC_SUBST' => 1, + 'AM_PROG_MOC' => 1, + 'AM_POT_TOOLS' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AC_FC_PP_DEFINE' => 1, + 'm4_pattern_forbid' => 1, + 'AC_PROG_LIBTOOL' => 1, 'AM_ENABLE_MULTILIB' => 1, - 'AH_OUTPUT' => 1, - 'm4_sinclude' => 1, + 'sinclude' => 1, + 'm4_pattern_allow' => 1, + '_AM_COND_ELSE' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AM_MAKEFILE_INCLUDE' => 1, + 'AC_LIBSOURCE' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AC_CANONICAL_TARGET' => 1, + 'AC_FC_PP_SRCEXT' => 1, + '_m4_warn' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AM_XGETTEXT_OPTION' => 1, + 'AM_PROG_F77_C_O' => 1, '_AM_COND_ENDIF' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AH_OUTPUT' => 1, 'AM_PROG_CXX_C_O' => 1, - 'AM_MAINTAINER_MODE' => 1, - '_AM_SUBST_NOTMAKE' => 1, + 'AC_SUBST_TRACE' => 1, 'AM_NLS' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AC_CONFIG_AUX_DIR' => 1, - 'AC_CANONICAL_TARGET' => 1, - 'AC_PROG_LIBTOOL' => 1, + 'AM_PROG_FC_C_O' => 1, + '_AM_MAKEFILE_INCLUDE' => 1, 'AM_SILENT_RULES' => 1, - 'AC_FC_FREEFORM' => 1, - 'LT_SUPPORTED_TAG' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AC_CONFIG_LINKS' => 1, + 'AM_CONDITIONAL' => 1, + 'm4_sinclude' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, 'include' => 1, - '_AM_MAKEFILE_INCLUDE' => 1, - 'sinclude' => 1, - 'AM_POT_TOOLS' => 1, - 'AM_PROG_FC_C_O' => 1, - 'AC_SUBST_TRACE' => 1, - 'AC_CONFIG_LIBOBJ_DIR' => 1, - 'AC_FC_SRCEXT' => 1, + 'LT_INIT' => 1, 'AC_CONFIG_HEADERS' => 1, 'AM_AUTOMAKE_VERSION' => 1, - 'm4_include' => 1, - 'AC_DEFINE_TRACE_LITERAL' => 1, - 'm4_pattern_forbid' => 1, - 'AC_FC_PP_DEFINE' => 1, - 'AC_CONFIG_FILES' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, 'AM_PROG_AR' => 1, - 'm4_pattern_allow' => 1, - 'AM_PROG_F77_C_O' => 1, - 'AM_MAKEFILE_INCLUDE' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_CONFIG_FILES' => 1, 'AM_PATH_GUILE' => 1, - 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, - 'AC_REQUIRE_AUX_FILE' => 1, - 'AC_CANONICAL_HOST' => 1, - 'AM_PROG_MOC' => 1, - 'LT_INIT' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'AC_CONFIG_LINKS' => 1, - 'AM_XGETTEXT_OPTION' => 1, - 'AM_CONDITIONAL' => 1, - 'AM_GNU_GETTEXT' => 1, - '_m4_warn' => 1, - 'AC_SUBST' => 1, - 'AC_FC_PP_SRCEXT' => 1, - '_AM_COND_ELSE' => 1, - 'AM_PROG_CC_C_O' => 1, - 'AC_INIT' => 1, - 'AC_CANONICAL_SYSTEM' => 1, 'AC_CANONICAL_BUILD' => 1, - 'AC_LIBSOURCE' => 1, - 'AC_CONFIG_SUBDIRS' => 1, - '_AM_COND_IF' => 1 + 'LT_SUPPORTED_TAG' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AC_INIT' => 1, + 'm4_include' => 1, + 'AC_FC_SRCEXT' => 1, + 'AC_CONFIG_AUX_DIR' => 1 } ], 'Autom4te::Request' ), bless( [ @@ -122,201 +122,201 @@ 'configure.ac' ], { - '_LT_AC_PROG_ECHO_BACKSLASH' => 1, - 'm4_pattern_allow' => 1, - 'LT_LANG' => 1, + 'AM_AUX_DIR_EXPAND' => 1, + 'AM_PROG_LD' => 1, + 'AM_MISSING_PROG' => 1, + '_LT_PROG_F77' => 1, + 'ACX_PROG_GNAT' => 1, + 'LT_AC_PROG_GCJ' => 1, 'AC_LIBTOOL_CONFIG' => 1, - 'ACX_PATH_SEP' => 1, - 'CXX_LIBTOOL_LINK_IFELSE' => 1, - '_LT_AC_PROG_CXXCPP' => 1, - 'CLANG_PLUGIN' => 1, - 'AC_ENABLE_FAST_INSTALL' => 1, - 'AM_PROG_INSTALL_SH' => 1, - 'ACX_HAVE_GCC_FOR_TARGET' => 1, - 'LTVERSION_VERSION' => 1, - 'AC_PROG_EGREP' => 1, - 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, - 'AC_LIBTOOL_FC' => 1, - '_LT_AC_LANG_GCJ_CONFIG' => 1, - '_GCC_TOPLEV_NONCANONICAL_TARGET' => 1, - '_LT_AC_FILE_LTDLL_C' => 1, - '_AM_SUBST_NOTMAKE' => 1, - 'GCC_TOPLEV_SUBDIRS' => 1, - 'AM_DEP_TRACK' => 1, + '_LT_AC_LANG_CXX_CONFIG' => 1, + 'LT_PROG_GO' => 1, 'AM_SANITY_CHECK' => 1, - 'AC_LIBTOOL_DLOPEN_SELF' => 1, - 'AC_LIBTOOL_OBJDIR' => 1, - '_LT_LINKER_BOILERPLATE' => 1, - '_LT_AC_SYS_COMPILER' => 1, - 'AC_DISABLE_FAST_INSTALL' => 1, - 'AC_LTDL_OBJDIR' => 1, - 'ACX_PKGVERSION' => 1, + 'AU_DEFUN' => 1, + 'AC_DEPLIBS_CHECK_METHOD' => 1, + 'AC_LIBTOOL_LANG_C_CONFIG' => 1, + 'AM_SET_DEPDIR' => 1, + 'CLANG_PLUGIN' => 1, + 'NCN_STRICT_CHECK_TARGET_TOOLS' => 1, + '_LT_AC_LANG_C_CONFIG' => 1, + '_AM_IF_OPTION' => 1, + 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, + 'AC_LIBTOOL_PICMODE' => 1, + 'include' => 1, + 'ANNOCHECK' => 1, + '_LT_AC_LOCK' => 1, + '_LT_AC_PROG_CXXCPP' => 1, + 'AM_DISABLE_STATIC' => 1, 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, + 'ACX_LT_HOST_FLAGS' => 1, + '_AM_SET_OPTION' => 1, '_m4_warn' => 1, - 'AC_PREREQ' => 1, - 'AC_LIBTOOL_DLOPEN' => 1, - 'LTOBSOLETE_VERSION' => 1, - 'AC_PROG_CPP_WERROR' => 1, - 'LT_PROG_RC' => 1, + 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, + '_LT_PROG_FC' => 1, + 'LT_AC_PROG_SED' => 1, '_LT_AC_SHELL_INIT' => 1, - 'LT_LIB_M' => 1, - 'AM_PROG_LD' => 1, - 'AM_MISSING_PROG' => 1, - '_LT_COMPILER_OPTION' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'DISABLE_RPATH' => 1, - 'AM_SET_DEPDIR' => 1, - 'ACX_HEADER_STRING' => 1, + '_LT_AC_LANG_F77_CONFIG' => 1, + 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, + 'LLVM_PLUGIN' => 1, + 'LT_SYS_DLOPEN_SELF' => 1, '_GCC_TOPLEV_NONCANONICAL_BUILD' => 1, - 'ACX_CHECK_PROG_VER' => 1, - 'AM_DISABLE_STATIC' => 1, - 'AM_SET_LEADING_DOT' => 1, - 'LT_AC_PROG_RC' => 1, - '_GCC_AUTOCONF_VERSION_CHECK' => 1, - '_LT_AC_CHECK_DLFCN' => 1, - '_LT_WITH_SYSROOT' => 1, - '_AM_DEPENDENCIES' => 1, - 'AM_PROG_INSTALL_STRIP' => 1, - 'AC_CHECK_LIBM' => 1, - 'AM_AUTOMAKE_VERSION' => 1, - 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, - 'include' => 1, - 'LT_SUPPORTED_TAG' => 1, - 'ACX_CHECK_CYGWIN_CAT_WORKS' => 1, - '_LT_AC_LANG_CXX' => 1, - 'GCC_PLUGIN' => 1, - '_LT_AC_LANG_F77' => 1, - 'AC_LIBTOOL_COMPILER_OPTION' => 1, - 'ACX_LT_HOST_FLAGS' => 1, - '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'm4_pattern_forbid' => 1, + 'AC_PREREQ' => 1, + 'AC_LIBTOOL_LINKER_OPTION' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, - '_LT_PREPARE_SED_QUOTE_VARS' => 1, - 'AC_LIBTOOL_GCJ' => 1, - '_LT_AC_LANG_RC_CONFIG' => 1, - 'AU_DEFUN' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'AM_PROG_NM' => 1, 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, - 'AM_AUX_DIR_EXPAND' => 1, - 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, + 'AM_PROG_LIBTOOL' => 1, + 'BUILD_GCC_PLUGIN' => 1, 'AC_LIBTOOL_F77' => 1, - 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, - 'AC_PROG_LD' => 1, - 'AC_PROG_LD_RELOAD_FLAG' => 1, - '_LT_PROG_FC' => 1, - 'AC_CONFIG_MACRO_DIR_TRACE' => 1, + 'GCC_TARGET_TOOL' => 1, + 'AM_ENABLE_STATIC' => 1, + 'AC_LIBTOOL_DLOPEN' => 1, + 'AM_SILENT_RULES' => 1, + 'ACX_CHECK_CYGWIN_CAT_WORKS' => 1, + '_LT_AC_LANG_F77' => 1, + 'ACX_CHECK_INSTALLED_TARGET_TOOL' => 1, + 'LTOPTIONS_VERSION' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, + 'AM_PROG_INSTALL_SH' => 1, + 'AC_ENABLE_SHARED' => 1, + 'AC_DISABLE_SHARED' => 1, 'AC_LIBTOOL_WIN32_DLL' => 1, - 'AM_PROG_CC_C_O' => 1, - 'NCN_STRICT_CHECK_TOOLS' => 1, - 'AC_DISABLE_STATIC' => 1, - 'AM_SUBST_NOTMAKE' => 1, - 'AC_PROG_LEX' => 1, - 'LT_PATH_NM' => 1, - '_LT_PATH_TOOL_PREFIX' => 1, - 'AM_CONDITIONAL' => 1, - 'AC_PATH_TOOL_PREFIX' => 1, - 'LT_INIT' => 1, - 'AC_DEFUN' => 1, - 'GCC_TARGET_TOOL' => 1, + 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'AC_PROG_LD_RELOAD_FLAG' => 1, '_LT_PROG_LTMAIN' => 1, - 'AC_CONFIG_MACRO_DIR' => 1, - 'AC_LIBTOOL_PICMODE' => 1, - 'm4_pattern_forbid' => 1, - '_AM_CONFIG_MACRO_DIRS' => 1, - 'AM_PROG_NM' => 1, - 'ACX_PROG_GNAT' => 1, - '_AC_PROG_LIBTOOL' => 1, - 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, - '_LT_AC_LANG_C_CONFIG' => 1, - '_LT_COMPILER_BOILERPLATE' => 1, - '_LT_AC_LANG_F77_CONFIG' => 1, - '_LT_AC_LANG_CXX_CONFIG' => 1, - '_GCC_TOPLEV_NONCANONICAL_HOST' => 1, - 'ACX_NONCANONICAL_TARGET' => 1, - 'AC_PROG_LIBTOOL' => 1, - 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, + 'LTSUGAR_VERSION' => 1, + 'LT_AC_PROG_RC' => 1, 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, - 'AC_LIBTOOL_LANG_C_CONFIG' => 1, - 'NCN_STRICT_CHECK_TARGET_TOOLS' => 1, - 'ACX_TOOL_DIRS' => 1, - 'AM_ENABLE_SHARED' => 1, - 'AC_DISABLE_SHARED' => 1, - 'AC_LIBTOOL_SETUP' => 1, - 'AM_ENABLE_STATIC' => 1, - '_LT_PROG_F77' => 1, - 'ACX_BUGURL' => 1, - 'DEBUGINFOD' => 1, - 'LTOPTIONS_VERSION' => 1, + 'LT_AC_PROG_EGREP' => 1, + 'AC_PROG_EGREP' => 1, + 'AM_SUBST_NOTMAKE' => 1, + '_LT_LINKER_BOILERPLATE' => 1, + 'AM_SET_LEADING_DOT' => 1, + 'AC_LIBTOOL_COMPILER_OPTION' => 1, + 'AC_LTDL_PREOPEN' => 1, + '_LT_AC_LANG_CXX' => 1, + 'CXX_LIBTOOL_LINK_IFELSE' => 1, + 'AC_ENABLE_FAST_INSTALL' => 1, + '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + '_LT_PATH_TOOL_PREFIX' => 1, + 'ACX_PKGVERSION' => 1, + 'ACX_PROG_CMP_IGNORE_INITIAL' => 1, + 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, + '_LT_WITH_SYSROOT' => 1, 'AC_LIBTOOL_CXX' => 1, - '_LT_DLL_DEF_P' => 1, - 'ACX_PROG_LN' => 1, - 'LLVM_PLUGIN' => 1, + 'm4_pattern_allow' => 1, + 'AC_LIBTOOL_OBJDIR' => 1, + 'LT_PROG_RC' => 1, + '_LT_AC_FILE_LTDLL_C' => 1, + 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, + '_LT_CC_BASENAME' => 1, + 'DISABLE_RPATH' => 1, + 'LT_LIB_M' => 1, + '_LT_AC_SYS_LIBPATH_AIX' => 1, + '_AM_AUTOCONF_VERSION' => 1, 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, - 'ACX_PROG_CMP_IGNORE_INITIAL' => 1, - 'GMP' => 1, + 'ACX_NONCANONICAL_HOST' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AC_LIBTOOL_DLOPEN_SELF' => 1, + 'AC_LIBTOOL_FC' => 1, + '_LT_AC_SYS_COMPILER' => 1, + 'AM_PROG_CC_C_O' => 1, + '_GCC_TOPLEV_NONCANONICAL_TARGET' => 1, + '_AM_DEPENDENCIES' => 1, 'LT_OUTPUT' => 1, - 'AM_MISSING_HAS_RUN' => 1, - 'BUILD_GCC_PLUGIN' => 1, - 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, - 'AC_PROG_LD_GNU' => 1, - '_LT_AC_SYS_LIBPATH_AIX' => 1, - 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, - '_LT_PROG_ECHO_BACKSLASH' => 1, - 'LT_SYS_DLOPEN_SELF' => 1, - 'AC_LIBTOOL_LINKER_OPTION' => 1, + '_LT_AC_TAGVAR' => 1, + 'ACX_PATH_SEP' => 1, + '_AM_CONFIG_MACRO_DIRS' => 1, + 'LT_PROG_GCJ' => 1, + 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, + 'AC_DEFUN' => 1, + 'AM_CONDITIONAL' => 1, + 'ZW_PROG_COMPILER_DEPENDENCIES' => 1, + 'ACX_BUGURL' => 1, + 'AC_LIBTOOL_GCJ' => 1, + '_LT_PREPARE_SED_QUOTE_VARS' => 1, + 'ACX_NONCANONICAL_TARGET' => 1, + '_GCC_TOPLEV_NONCANONICAL_HOST' => 1, + 'ACX_PROG_LN' => 1, 'ZW_CREATE_DEPDIR' => 1, - 'LTSUGAR_VERSION' => 1, - 'AM_PROG_LIBTOOL' => 1, - 'LT_AC_PROG_SED' => 1, - 'm4_include' => 1, + 'AC_DISABLE_STATIC' => 1, + 'AM_RUN_LOG' => 1, + '_LT_AC_LANG_GCJ_CONFIG' => 1, + 'AM_MISSING_HAS_RUN' => 1, + 'LT_LANG' => 1, + 'AC_PROG_LD' => 1, + 'ACX_CHECK_PROG_VER' => 1, + '_LT_COMPILER_OPTION' => 1, + '_LT_LINKER_OPTION' => 1, + 'LT_CMD_MAX_LEN' => 1, '_LT_AC_TRY_DLOPEN_SELF' => 1, - 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, - 'AM_MAKE_INCLUDE' => 1, - 'ACX_CHECK_INSTALLED_TARGET_TOOL' => 1, + 'AC_CONFIG_MACRO_DIR_TRACE' => 1, 'AC_PATH_MAGIC' => 1, - 'AC_DEFUN_ONCE' => 1, - 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, - '_LT_AC_LANG_GCJ' => 1, - 'AC_ENABLE_STATIC' => 1, - 'AM_DISABLE_SHARED' => 1, - 'AC_ENABLE_SHARED' => 1, + 'LT_PATH_LD' => 1, + '_LT_PROG_ECHO_BACKSLASH' => 1, + 'LTVERSION_VERSION' => 1, + 'ACX_HAVE_GCC_FOR_TARGET' => 1, + 'AC_LTDL_OBJDIR' => 1, + '_AM_SET_OPTIONS' => 1, + '_LT_REQUIRED_DARWIN_CHECKS' => 1, + 'AC_DISABLE_FAST_INSTALL' => 1, + '_LT_COMPILER_BOILERPLATE' => 1, + 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, 'AC_LIBTOOL_RC' => 1, - '_LT_PROG_CXX' => 1, - '_LT_LINKER_OPTION' => 1, - 'AM_SILENT_RULES' => 1, - '_LT_AC_LOCK' => 1, - '_AM_PROG_TAR' => 1, - 'AC_PROG_NM' => 1, - 'LT_AC_PROG_GCJ' => 1, + 'AC_PROG_LEX' => 1, + 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, + '_AC_PROG_LIBTOOL' => 1, + 'AM_MAKE_INCLUDE' => 1, + '_LT_AC_PROG_ECHO_BACKSLASH' => 1, '_AM_PROG_CC_C_O' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'ANNOCHECK' => 1, - 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, - 'ACX_NONCANONICAL_BUILD' => 1, - 'LT_PATH_LD' => 1, - '_AM_IF_OPTION' => 1, - 'ZW_PROG_COMPILER_DEPENDENCIES' => 1, + 'DEBUGINFOD' => 1, + '_LT_AC_LANG_GCJ' => 1, + 'm4_include' => 1, + 'AM_DEP_TRACK' => 1, + 'AC_CHECK_LIBM' => 1, + 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, + 'ACX_HEADER_STRING' => 1, '_NCN_TOOL_PREFIXES' => 1, - '_LT_CC_BASENAME' => 1, - '_LT_REQUIRED_DARWIN_CHECKS' => 1, + 'ACX_TOOL_DIRS' => 1, + '_AM_MANGLE_OPTION' => 1, + '_LT_DLL_DEF_P' => 1, + 'LT_INIT' => 1, + 'AM_PROG_INSTALL_STRIP' => 1, + '_LT_AC_CHECK_DLFCN' => 1, + 'AC_ENABLE_STATIC' => 1, + 'GMP' => 1, + '_LT_PROG_CXX' => 1, + '_GCC_AUTOCONF_VERSION_CHECK' => 1, + 'LIBELF' => 1, 'AC_LTDL_ENABLE_INSTALL' => 1, - '_AM_SET_OPTION' => 1, + 'GCC_PLUGIN' => 1, + 'AM_ENABLE_SHARED' => 1, + 'AC_DEFUN_ONCE' => 1, + 'GCC_TOPLEV_SUBDIRS' => 1, + 'AC_PROG_CPP_WERROR' => 1, + 'AC_PROG_LD_GNU' => 1, + 'AC_CONFIG_MACRO_DIR' => 1, + 'AM_DISABLE_SHARED' => 1, + 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'ACX_HEADER_STDBOOL' => 1, 'AC_LIBTOOL_PROG_CC_C_O' => 1, - '_AM_SET_OPTIONS' => 1, - 'LIBELF' => 1, + 'AC_LIBTOOL_SETUP' => 1, + 'ACX_NONCANONICAL_BUILD' => 1, + 'AC_PROG_NM' => 1, + 'LTOBSOLETE_VERSION' => 1, + 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, + '_AM_PROG_TAR' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'AC_PATH_TOOL_PREFIX' => 1, + 'LT_PATH_NM' => 1, 'GCC_BASE_VER' => 1, - 'LT_PROG_GO' => 1, - 'AM_RUN_LOG' => 1, - '_AM_AUTOCONF_VERSION' => 1, - 'LT_AC_PROG_EGREP' => 1, - 'LT_CMD_MAX_LEN' => 1, - 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, - '_LT_AC_TAGVAR' => 1, - 'LT_PROG_GCJ' => 1, - '_AM_MANGLE_OPTION' => 1, - 'AC_LTDL_PREOPEN' => 1, - 'AC_DEPLIBS_CHECK_METHOD' => 1, - 'ACX_NONCANONICAL_HOST' => 1, - 'ACX_HEADER_STDBOOL' => 1 + '_LT_AC_LANG_RC_CONFIG' => 1, + 'NCN_STRICT_CHECK_TOOLS' => 1, + 'AC_PROG_LIBTOOL' => 1 } ], 'Autom4te::Request' ), bless( [ @@ -331,65 +331,65 @@ 'configure.ac' ], { - 'AC_CANONICAL_BUILD' => 1, - '_AM_COND_IF' => 1, - 'AC_CONFIG_SUBDIRS' => 1, - 'AC_LIBSOURCE' => 1, - 'AC_FC_PP_SRCEXT' => 1, - 'AC_CANONICAL_SYSTEM' => 1, 'AC_INIT' => 1, - '_AM_COND_ELSE' => 1, - 'AM_PROG_CC_C_O' => 1, - 'AM_EXTRA_RECURSIVE_TARGETS' => 1, - 'AM_GNU_GETTEXT' => 1, - 'AC_SUBST' => 1, - '_m4_warn' => 1, - 'AM_CONDITIONAL' => 1, - 'AM_XGETTEXT_OPTION' => 1, - 'AM_PROG_MKDIR_P' => 1, - '_LT_AC_TAGCONFIG' => 1, - 'AC_CONFIG_LINKS' => 1, - 'LT_INIT' => 1, - 'AM_PROG_MOC' => 1, - 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, - 'AC_REQUIRE_AUX_FILE' => 1, - 'AC_CANONICAL_HOST' => 1, - 'AM_MAKEFILE_INCLUDE' => 1, - 'AM_PROG_F77_C_O' => 1, - 'AM_PATH_GUILE' => 1, - 'AM_PROG_AR' => 1, - 'm4_pattern_allow' => 1, - 'm4_pattern_forbid' => 1, - 'AC_FC_PP_DEFINE' => 1, - 'AC_CONFIG_FILES' => 1, 'm4_include' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, - 'LT_CONFIG_LTDL_DIR' => 1, - 'AC_CONFIG_LIBOBJ_DIR' => 1, - 'AC_SUBST_TRACE' => 1, - 'AM_POT_TOOLS' => 1, - 'AM_PROG_FC_C_O' => 1, - 'AM_AUTOMAKE_VERSION' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'AM_PROG_MKDIR_P' => 1, 'AC_FC_SRCEXT' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AM_PROG_AR' => 1, + 'AM_AUTOMAKE_VERSION' => 1, 'AC_CONFIG_HEADERS' => 1, - 'LT_SUPPORTED_TAG' => 1, + 'AM_PATH_GUILE' => 1, + 'AC_CONFIG_FILES' => 1, + 'AM_CONDITIONAL' => 1, + 'LT_INIT' => 1, 'include' => 1, - '_AM_MAKEFILE_INCLUDE' => 1, - 'sinclude' => 1, - 'AC_PROG_LIBTOOL' => 1, - 'AM_SILENT_RULES' => 1, - 'AC_FC_FREEFORM' => 1, - 'AM_INIT_AUTOMAKE' => 1, - 'AM_NLS' => 1, - 'AC_CANONICAL_TARGET' => 1, - 'AC_CONFIG_AUX_DIR' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, 'm4_sinclude' => 1, - '_AM_SUBST_NOTMAKE' => 1, + 'AM_NLS' => 1, + 'AC_SUBST_TRACE' => 1, 'AM_PROG_CXX_C_O' => 1, + 'AC_CONFIG_LINKS' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AM_SILENT_RULES' => 1, + '_AM_MAKEFILE_INCLUDE' => 1, + 'AM_PROG_FC_C_O' => 1, '_AM_COND_ENDIF' => 1, + 'AM_PROG_F77_C_O' => 1, + 'AH_OUTPUT' => 1, + 'AM_GNU_GETTEXT' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + 'AC_CANONICAL_TARGET' => 1, + 'AC_FC_PP_SRCEXT' => 1, 'AM_MAINTAINER_MODE' => 1, + 'AC_LIBSOURCE' => 1, + 'AM_XGETTEXT_OPTION' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + '_m4_warn' => 1, + 'AM_EXTRA_RECURSIVE_TARGETS' => 1, + 'm4_pattern_allow' => 1, + 'sinclude' => 1, 'AM_ENABLE_MULTILIB' => 1, - 'AH_OUTPUT' => 1 + 'm4_pattern_forbid' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AM_MAKEFILE_INCLUDE' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AC_CANONICAL_HOST' => 1, + '_AM_COND_ELSE' => 1, + 'AM_PROG_MOC' => 1, + 'AC_SUBST' => 1, + '_AM_COND_IF' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AC_FC_FREEFORM' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'AC_FC_PP_DEFINE' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AM_POT_TOOLS' => 1 } ], 'Autom4te::Request' ) ); diff --git a/clang-plugin/Makefile.in b/clang-plugin/Makefile.in index 9836112..7db3b47 100644 --- a/clang-plugin/Makefile.in +++ b/clang-plugin/Makefile.in @@ -47,8 +47,8 @@ PLUGIN_TEST_OPTIONS = \ # -fcf-protection \ check: @srcdir@/hello.c - @ $(CLANG) -fplugin=$(PLUGIN) $(PLUGIN_TEST_OPTIONS) -c @srcdir@/hello.c - @ $(READELF) --wide --notes hello.o > clang-plugin-test.out + $(CLANG) -fplugin=$(PLUGIN) $(PLUGIN_TEST_OPTIONS) -c @srcdir@/hello.c + $(READELF) --wide --notes hello.o > clang-plugin-test.out @ grep --silent -e "annobin built by clang version" clang-plugin-test.out @ grep --silent -e "running on clang version" clang-plugin-test.out @ grep --silent -e "sanitize_cfi" clang-plugin-test.out diff --git a/tests/Makefile.am b/tests/Makefile.am index 5ac34e3..dd708f8 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -11,6 +11,7 @@ TESTS=compile-test \ active-checks-test \ assembler-gap-test \ function-sections-test \ + glibc-notes-test \ hardening-fail-test \ hardening-test \ instrumentation-test \ diff --git a/tests/Makefile.in b/tests/Makefile.in index e7ca9dc..4d4a8a3 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -475,9 +475,10 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ TESTS = compile-test abi-test active-checks-test assembler-gap-test \ - function-sections-test hardening-fail-test hardening-test \ - instrumentation-test lto-test missing-notes-test objcopy-test \ - section-size-test $(am__append_1) + function-sections-test glibc-notes-test hardening-fail-test \ + hardening-test instrumentation-test lto-test \ + missing-notes-test objcopy-test section-size-test \ + $(am__append_1) XFAIL_TESTS = hardening-fail-test \ missing-notes-test \ active-checks-test \ @@ -705,6 +706,13 @@ function-sections-test.log: function-sections-test --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) +glibc-notes-test.log: glibc-notes-test + @p='glibc-notes-test'; \ + b='glibc-notes-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) hardening-fail-test.log: hardening-fail-test @p='hardening-fail-test'; \ b='hardening-fail-test'; \ diff --git a/tests/glibc-notes-test b/tests/glibc-notes-test new file mode 100755 index 0000000..ab9e639 --- /dev/null +++ b/tests/glibc-notes-test @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright (c) 2017-2021 Red Hat. +# +# This 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. +# +# It 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. + +# Mimics how glibc builds C sources without annotation. + +rm -f hello.o hello2.o hello3.o libhello.so glibc-notes.exe glibc-notes.out + +GCC=${GCC:-gcc} +ANNOCHECK=${ANNOCHECK:-../annocheck/annocheck} + +OPTS="-g -c -O2 -fpie" + +$GCC -Wl,-a,--generate-missing-build-notes=yes $OPTS $srcdir/hello.c +$GCC -Wl,-a,--generate-missing-build-notes=yes $OPTS $srcdir/hello2.c +$GCC -Wl,-a,--generate-missing-build-notes=yes $OPTS $srcdir/hello3.c +$GCC -Wl,-a,--generate-missing-build-notes=yes $OPTS -shared $srcdir/hello_lib.c -o libhello.so + +# Link without system files as these may not have been hardened. +$GCC -pie -Wl,-z,now hello.o hello2.o hello3.o -L. -lhello -o glibc-notes.exe + +# Run annocheck + +$ANNOCHECK glibc-notes.exe --skip-cf-protection --skip-property-note --ignore-gaps > glibc-notes.out +grep -e "PASS" glibc-notes.out +if [ $? != 0 ]; +then + echo "glibc-notes-test: FAIL: generating assembler notes did not hide lack of GCC notes" + cat glibc-notes.out + exit 1 +fi + -- 2.43.5