diff options
author | Alan Modra <amodra@bigpond.net.au> | 2011-05-29 04:51:38 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2011-05-29 04:51:38 +0000 |
commit | ed81535f4d08dc56c554085c3938f65db159a333 (patch) | |
tree | 85e15686e76a5c1803839aeb6580e0d4e25fd96d /ld | |
parent | af085846a25cd10d46aaa0566d8031b9727654ef (diff) | |
download | binutils-redhat-ed81535f4d08dc56c554085c3938f65db159a333.tar.gz |
PR 12365
PR 12613
PR 12632
PR 12739
PR 12753
PR 12760
PR 12763
Apply fix from mainline along with assorted other small fixes.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 51 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 2 | ||||
-rw-r--r-- | ld/emultempl/pe.em | 9 | ||||
-rw-r--r-- | ld/emultempl/pep.em | 9 | ||||
-rw-r--r-- | ld/ldexp.c | 22 | ||||
-rw-r--r-- | ld/ldlang.c | 37 | ||||
-rw-r--r-- | ld/ldlex.l | 2 | ||||
-rw-r--r-- | ld/ldmain.c | 6 | ||||
-rw-r--r-- | ld/plugin.c | 40 | ||||
-rw-r--r-- | ld/scripttempl/pe.sc | 11 | ||||
-rw-r--r-- | ld/scripttempl/pep.sc | 11 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 16 | ||||
-rw-r--r-- | ld/testsuite/ld-cris/tls-e-tpoffcomm1.d | 34 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/plugin-7.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/plugin-8.d | 2 |
15 files changed, 203 insertions, 51 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 13eaa9bb81..4484c3da2c 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,54 @@ +2011-05-29 Alan Modra <amodra@gmail.com> + + Apply from mainline + 2011-05-23 Alan Modra <amodra@gmail.com> + PR 12763 + * ldlang.c (lang_output_section_find_by_flags): Match orphan .sdata2 + like sections to existing .sdata2, and similarly for orphan TLS + sections. + * emultempl/elf32.em (place_orphan): Exclude .tbss from orphan_bss. + + 2011-05-17 Alan Modra <amodra@gmail.com> + PR ld/12760 + * ldmain.c (notice): Add "flags" and "string" param. + * plugin.c (plugin_notice): Likewise. Handle indirect, warning + and constructor syms. + + 2010-05-16 Daniel Jacobowitz <dan@codesourcery.com> + * ldlang.c (print_assignment): Use the symbol's section if we + use its value. + * ldexp.c (exp_fold_tree_1): Skip self-assignment. Expand + comment on copying symbol type. + + 2011-05-07 Dave Korn <dave.korn.cygwin@gmail.com> + PR ld/12365 + * scripttempl/pe.sc (__rt_psrelocs_start): New symbol definition. + (__rt_psrelocs_end): Likewise. + (__rt_psrelocs_size): Likewise difference between the above. + (__RUNTIME_PSEUDO_RELOC_LIST_END__): Move outside .rdata section + immediately after end of pseudo-reloc data. + (___RUNTIME_PSEUDO_RELOC_LIST_END___): Likewise. + (__RUNTIME_PSEUDO_RELOC_LIST__): Move outside .rdata section and + calculate backward from list end. + (___RUNTIME_PSEUDO_RELOC_LIST___): Likewise. + * scripttempl/pep.sc: Likewise. + + 2011-03-29 Alan Modra <amodra@gmail.com> + PR ld/12613 + * ldlex.l (lex_warn_invalid): Don't assume char is unsigned. + + 2011-03-10 Dave Korn <dave.korn.cygwin@gmail.com> + * emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Preserve + alignment of input sections when creating orphan output sections + during relocatable link. + * emultempl/pep.em (gld_${EMULATION_NAME}_place_orphan): Likewise. + + 2011-02-14 Mike Frysinger <vapier@gentoo.org> + * ldlang.c (lang_vers_match): Declare a new c_sym, assign it to + the bfd_demangle of sym, change users of sym to c_sym when not + already demangling, and free when done. Change callers of + cplus_demangle to bfd_demangle. + 2011-05-16 H.J. Lu <hongjiu.lu@intel.com> PR ld/12760 diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index ddcd5901fd..62a86ca217 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1919,7 +1919,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s, && ((iself && sh_type == SHT_NOTE) || (!iself && CONST_STRNEQ (secname, ".note")))) place = &hold[orphan_interp]; - else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) + else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0) place = &hold[orphan_bss]; else if ((s->flags & SEC_SMALL_DATA) != 0) place = &hold[orphan_sdata]; diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index f9085f2fe7..cad49d28a5 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -2009,10 +2009,17 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, ->output_section_statement); } - /* All sections in an executable must be aligned to a page boundary. */ + /* All sections in an executable must be aligned to a page boundary. + In a relocatable link, just preserve the incoming alignment; the + address is discarded by lang_insert_orphan in that case, anyway. */ address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__")); os = lang_insert_orphan (s, secname, constraint, after, place, address, &add_child); + if (link_info.relocatable) + { + os->section_alignment = s->alignment_power; + os->bfd_section->alignment_power = s->alignment_power; + } } /* If the section name has a '\$', sort it with the other '\$' diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index 90793ea9b6..78751bb71b 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -1745,10 +1745,17 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, ->output_section_statement); } - /* All sections in an executable must be aligned to a page boundary. */ + /* All sections in an executable must be aligned to a page boundary. + In a relocatable link, just preserve the incoming alignment; the + address is discarded by lang_insert_orphan in that case, anyway. */ address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__")); os = lang_insert_orphan (s, secname, constraint, after, place, address, &add_child); + if (link_info.relocatable) + { + os->section_alignment = s->alignment_power; + os->bfd_section->alignment_power = s->alignment_power; + } } /* If the section name has a '\$', sort it with the other '\$' diff --git a/ld/ldexp.c b/ld/ldexp.c index f70634c5c6..68617d8553 100644 --- a/ld/ldexp.c +++ b/ld/ldexp.c @@ -832,6 +832,8 @@ exp_fold_tree_1 (etree_type *tree) } else { + etree_type *name; + struct bfd_link_hash_entry *h = NULL; if (tree->type.node_class == etree_provide) @@ -849,6 +851,23 @@ exp_fold_tree_1 (etree_type *tree) } } + name = tree->assign.src; + if (name->type.node_class == etree_trinary) + { + exp_fold_tree_1 (name->trinary.cond); + if (expld.result.valid_p) + name = (expld.result.value + ? name->trinary.lhs : name->trinary.rhs); + } + + if (name->type.node_class == etree_name + && name->type.node_code == NAME + && strcmp (tree->assign.dst, name->name.name) == 0) + /* Leave it alone. Do not replace a symbol with its own + output address, in case there is another section sizing + pass. Folding does not preserve input sections. */ + break; + exp_fold_tree_1 (tree->assign.src); if (expld.result.valid_p || (expld.phase == lang_first_phase_enum @@ -876,7 +895,8 @@ exp_fold_tree_1 (etree_type *tree) tree->type.node_class = etree_provided; /* Copy the symbol type if this is a simple assignment of - one symbol to annother. */ + one symbol to another. This could be more general + (e.g. a ?: operator with NAMEs in each branch). */ if (tree->assign.src->type.node_class == etree_name) { struct bfd_link_hash_entry *hsrc; diff --git a/ld/ldlang.c b/ld/ldlang.c index cba509b84e..8b05d8e120 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1526,8 +1526,14 @@ lang_output_section_find_by_flags (const asection *sec, } flags ^= sec->flags; if (!(flags & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD - | SEC_READONLY)) - && !(look->flags & (SEC_SMALL_DATA | SEC_THREAD_LOCAL))) + | SEC_READONLY | SEC_SMALL_DATA)) + || (!(flags & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD + | SEC_READONLY)) + && !(look->flags & SEC_SMALL_DATA)) + || (!(flags & (SEC_THREAD_LOCAL | SEC_ALLOC)) + && (look->flags & SEC_THREAD_LOCAL) + && (!(flags & SEC_LOAD) + || (look->flags & SEC_LOAD)))) found = look; } } @@ -3995,9 +4001,8 @@ print_assignment (lang_assignment_statement_type *assignment, if (h) { value = h->u.def.value; - - if (expld.result.section != NULL) - value += expld.result.section->vma; + value += h->u.def.section->output_section->vma; + value += h->u.def.section->output_offset; minfo ("[0x%V]", value); } @@ -7387,19 +7392,29 @@ lang_vers_match (struct bfd_elf_version_expr_head *head, struct bfd_elf_version_expr *prev, const char *sym) { + const char *c_sym; const char *cxx_sym = sym; const char *java_sym = sym; struct bfd_elf_version_expr *expr = NULL; + enum demangling_styles curr_style; + + curr_style = CURRENT_DEMANGLING_STYLE; + cplus_demangle_set_style (no_demangling); + c_sym = bfd_demangle (link_info.output_bfd, sym, DMGL_NO_OPTS); + if (!c_sym) + c_sym = sym; + cplus_demangle_set_style (curr_style); if (head->mask & BFD_ELF_VERSION_CXX_TYPE) { - cxx_sym = cplus_demangle (sym, DMGL_PARAMS | DMGL_ANSI); + cxx_sym = bfd_demangle (link_info.output_bfd, sym, + DMGL_PARAMS | DMGL_ANSI); if (!cxx_sym) cxx_sym = sym; } if (head->mask & BFD_ELF_VERSION_JAVA_TYPE) { - java_sym = cplus_demangle (sym, DMGL_JAVA); + java_sym = bfd_demangle (link_info.output_bfd, sym, DMGL_JAVA); if (!java_sym) java_sym = sym; } @@ -7413,10 +7428,10 @@ lang_vers_match (struct bfd_elf_version_expr_head *head, case 0: if (head->mask & BFD_ELF_VERSION_C_TYPE) { - e.pattern = sym; + e.pattern = c_sym; expr = (struct bfd_elf_version_expr *) htab_find ((htab_t) head->htab, &e); - while (expr && strcmp (expr->pattern, sym) == 0) + while (expr && strcmp (expr->pattern, c_sym) == 0) if (expr->mask == BFD_ELF_VERSION_C_TYPE) goto out_ret; else @@ -7474,12 +7489,14 @@ lang_vers_match (struct bfd_elf_version_expr_head *head, else if (expr->mask == BFD_ELF_VERSION_CXX_TYPE) s = cxx_sym; else - s = sym; + s = c_sym; if (fnmatch (expr->pattern, s, 0) == 0) break; } out_ret: + if (c_sym != sym) + free ((char *) c_sym); if (cxx_sym != sym) free ((char *) cxx_sym); if (java_sym != sym) diff --git a/ld/ldlex.l b/ld/ldlex.l index 3213cf7c05..451d0ac8f2 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -688,7 +688,7 @@ lex_warn_invalid (char *where, char *what) if (! ISPRINT (*what)) { - sprintf (buf, "\\%03o", (unsigned int) *what); + sprintf (buf, "\\%03o", *(unsigned char *) what); what = buf; } diff --git a/ld/ldmain.c b/ld/ldmain.c index bfa6066b09..96f3bdaf3e 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -151,7 +151,7 @@ static bfd_boolean unattached_reloc (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma); static bfd_boolean notice (struct bfd_link_info *, struct bfd_link_hash_entry *, - bfd *, asection *, bfd_vma); + bfd *, asection *, bfd_vma, flagword, const char *); static struct bfd_link_callbacks link_callbacks = { @@ -1483,7 +1483,9 @@ notice (struct bfd_link_info *info, struct bfd_link_hash_entry *h, bfd *abfd, asection *section, - bfd_vma value) + bfd_vma value, + flagword flags ATTRIBUTE_UNUSED, + const char *string ATTRIBUTE_UNUSED) { const char *name; diff --git a/ld/plugin.c b/ld/plugin.c index ca7b0b8550..acd47f3f01 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -125,9 +125,9 @@ static const enum ld_plugin_tag tv_header_tags[] = static const size_t tv_header_size = ARRAY_SIZE (tv_header_tags); /* Forward references. */ -static bfd_boolean plugin_notice (struct bfd_link_info *info, - struct bfd_link_hash_entry *h, bfd *abfd, - asection *section, bfd_vma value); +static bfd_boolean plugin_notice (struct bfd_link_info *, + struct bfd_link_hash_entry *, bfd *, + asection *, bfd_vma, flagword, const char *); #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) @@ -908,7 +908,9 @@ plugin_notice (struct bfd_link_info *info, struct bfd_link_hash_entry *h, bfd *abfd, asection *section, - bfd_vma value) + bfd_vma value, + flagword flags, + const char *string) { if (h != NULL) { @@ -918,8 +920,33 @@ plugin_notice (struct bfd_link_info *info, if (is_ir_dummy_bfd (abfd)) return TRUE; + /* Making an indirect symbol counts as a reference unless this + is a brand new symbol. */ + if (bfd_is_ind_section (section) + || (flags & BSF_INDIRECT) != 0) + { + if (h->type != bfd_link_hash_new) + { + struct bfd_link_hash_entry *inh; + + h->non_ir_ref = TRUE; + inh = bfd_wrapped_link_hash_lookup (abfd, info, string, FALSE, + FALSE, FALSE); + if (inh != NULL) + inh->non_ir_ref = TRUE; + } + } + + /* Nothing to do here for warning symbols. */ + else if ((flags & BSF_WARNING) != 0) + ; + + /* Nothing to do here for constructor symbols. */ + else if ((flags & BSF_CONSTRUCTOR) != 0) + ; + /* If this is a ref, set non_ir_ref. */ - if (bfd_is_und_section (section)) + else if (bfd_is_und_section (section)) h->non_ir_ref = TRUE; /* Otherwise, it must be a new def. Ensure any symbol defined @@ -945,6 +972,7 @@ plugin_notice (struct bfd_link_info *info, || (info->notice_hash != NULL && bfd_hash_lookup (info->notice_hash, h->root.string, FALSE, FALSE) != NULL)) - return (*orig_callbacks->notice) (info, h, abfd, section, value); + return (*orig_callbacks->notice) (info, h, + abfd, section, value, flags, string); return TRUE; } diff --git a/ld/scripttempl/pe.sc b/ld/scripttempl/pe.sc index 7d52cc542c..2f8b09129f 100644 --- a/ld/scripttempl/pe.sc +++ b/ld/scripttempl/pe.sc @@ -106,12 +106,15 @@ SECTIONS .rdata ${RELOCATING+BLOCK(__section_alignment__)} : { ${R_RDATA} - ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST__ = .;} - ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST__ = .;} + ${RELOCATING+__rt_psrelocs_start = .;} *(.rdata_runtime_pseudo_reloc) - ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} - ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} + ${RELOCATING+__rt_psrelocs_end = .;} } + ${RELOCATING+__rt_psrelocs_size = __rt_psrelocs_end - __rt_psrelocs_start;} + ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} + ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} + ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size;} + ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size;} .eh_frame ${RELOCATING+BLOCK(__section_alignment__)} : { diff --git a/ld/scripttempl/pep.sc b/ld/scripttempl/pep.sc index 8fa5f052d6..decbd666fe 100644 --- a/ld/scripttempl/pep.sc +++ b/ld/scripttempl/pep.sc @@ -107,12 +107,15 @@ SECTIONS .rdata ${RELOCATING+BLOCK(__section_alignment__)} : { ${R_RDATA} - ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST__ = .;} - ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST__ = .;} + ${RELOCATING+__rt_psrelocs_start = .;} *(.rdata_runtime_pseudo_reloc) - ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} - ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} + ${RELOCATING+__rt_psrelocs_end = .;} } + ${RELOCATING+__rt_psrelocs_size = __rt_psrelocs_end - __rt_psrelocs_start;} + ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} + ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;} + ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size;} + ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size;} .eh_frame ${RELOCATING+BLOCK(__section_alignment__)} : { diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 4dfdd57855..1a994bc740 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,19 @@ +2011-05-24 Hans-Peter Nilsson <hp@axis.com> + + * ld-cris/tls-e-tpoffcomm1.d: Adjust for second PR12763 change, + setting TLS file offset. + +2011-05-21 Hans-Peter Nilsson <hp@axis.com> + + * ld-cris/tls-e-tpoffcomm1.d: Adjust for PR12763 change removing + empty program header. + +2011-05-07 Dave Korn <dave.korn.cygwin@gmail.com> + + PR ld/12365 + * ld-plugin/plugin-7.d: Allow underscore in error message. + * ld-plugin/plugin-8.d: Likewise. + 2012-05-25 H.J. Lu <hongjiu.lu@intel.com> Backport from mainline diff --git a/ld/testsuite/ld-cris/tls-e-tpoffcomm1.d b/ld/testsuite/ld-cris/tls-e-tpoffcomm1.d index 69780cfd57..23d52ee06d 100644 --- a/ld/testsuite/ld-cris/tls-e-tpoffcomm1.d +++ b/ld/testsuite/ld-cris/tls-e-tpoffcomm1.d @@ -11,35 +11,33 @@ Program Header: LOAD off 0x0+ vaddr 0x0+80000 paddr 0x0+80000 align 2\*\*13 - filesz 0x0+a4 memsz 0x0+a4 flags r-x - LOAD off 0x0+a4 vaddr 0x0+820a4 paddr 0x0+820a4 align 2\*\*13 - filesz 0x0+ memsz 0x0+ flags rw- - TLS off 0x0+a4 vaddr 0x0+820a4 paddr 0x0+820a4 align 2\*\*2 + filesz 0x0+84 memsz 0x0+84 flags r-x + TLS off 0x0+84 vaddr 0x0+82084 paddr 0x0+82084 align 2\*\*2 filesz 0x0+ memsz 0x0+8 flags r-- private flags = 0: Sections: Idx Name Size VMA LMA File off Algn - 0 .text 0+10 0+80094 0+80094 0+94 2\*\*1 + 0 .text 0+10 0+80074 0+80074 0+74 2\*\*1 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .tbss 0+8 0+820a4 0+820a4 0+a4 2\*\*2 + 1 .tbss 0+8 0+82084 0+82084 0+84 2\*\*2 ALLOC, THREAD_LOCAL SYMBOL TABLE: -0+80094 l d .text 0+ .text -0+820a4 l d .tbss 0+ .tbss -0+80098 l F .text 0+c do_test -0+80094 g .text 0+ _start -0+820a4 g \*ABS\* 0+ __bss_start +0+80074 l d .text 0+ .text +0+82084 l d .tbss 0+ .tbss +0+80078 l F .text 0+c do_test +0+80074 g .text 0+ _start +0+82084 g \*ABS\* 0+ __bss_start 0+ g .tbss 0+4 foo -0+820a4 g \*ABS\* 0+ _edata -0+820c0 g \*ABS\* 0+ _end +0+82084 g \*ABS\* 0+ _edata +0+820a0 g \*ABS\* 0+ _end 0+4 g .tbss 0+4 bar #... Disassembly of section .text: -00080094 <_start>: - 80094: 41b2 moveq 1,\$r11 +00080074 <_start>: + 80074: 41b2 moveq 1,\$r11 #... -00080098 <do_test>: - 80098: 2f0e f8ff ffff add.d 0xfffffff8,\$r0 - 8009e: 2f1e fcff ffff add.d 0xfffffffc,\$r1 +00080078 <do_test>: + 80078: 2f0e f8ff ffff add.d 0xfffffff8,\$r0 + 8007e: 2f1e fcff ffff add.d 0xfffffffc,\$r1 diff --git a/ld/testsuite/ld-plugin/plugin-7.d b/ld/testsuite/ld-plugin/plugin-7.d index 04f41392ca..4d0b9d7d91 100644 --- a/ld/testsuite/ld-plugin/plugin-7.d +++ b/ld/testsuite/ld-plugin/plugin-7.d @@ -26,6 +26,6 @@ hook called: claim_file tmpdir/func.o \[@0/.* CLAIMED hook called: claim_file tmpdir/text.o \[@0/.* not claimed #... hook called: all symbols read. -`func' referenced in section `\.text.*' of tmpdir/main.o: defined in discarded section .* +`_?func' referenced in section `\.text.*' of tmpdir/main.o: defined in discarded section .* hook called: cleanup. #... diff --git a/ld/testsuite/ld-plugin/plugin-8.d b/ld/testsuite/ld-plugin/plugin-8.d index 003537c94f..a589f01efc 100644 --- a/ld/testsuite/ld-plugin/plugin-8.d +++ b/ld/testsuite/ld-plugin/plugin-8.d @@ -30,6 +30,6 @@ hook called: claim_file tmpdir/text.o \[@0/.* not claimed hook called: all symbols read. Sym: '_?func' Resolution: LDPR_PREVAILING_DEF Sym: '_?func2' Resolution: LDPR_PREVAILING_DEF_IRONLY -`func' referenced in section `\.text.*' of tmpdir/main.o: defined in discarded section .* +`_?func' referenced in section `\.text.*' of tmpdir/main.o: defined in discarded section .* hook called: cleanup. #... |