Unify the behaviour of ld.bfd and ld.gold with respect to warning about unresolved...
authorFangrui Song <maskray@google.com>
Wed, 15 Apr 2020 13:25:08 +0000 (14:25 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 15 Apr 2020 13:25:08 +0000 (14:25 +0100)
PR binutils/24613
include * bfdlink.h (enum report_method): Delete RM_GENERATE_WARNING and
RM_GENERATE_ERROR. Add RM_DIAGNOSE.
(struct bfd_link_info): Add warn_unresolved_syms.

ld * lexsup.c (parse_args): Change RM_GENERATE_WARNING and
RM_GENERATE_ERROR to RM_DIAGNOSE.
* emultempl/aix.em (ld_${EMULATION_NAME}_emulation): Change
RM_GENERATE_ERROR to RM_DIAGNOSE.
* emultempl/elf.em (ld_${EMULATION_NAME}_emulation): Likewise.

bfd * coff-rs6000.c (xcoff_ppc_relocate_section): Change RM_GENERATE_ERROR
to RM_DIAGNOSE plus a check of warn_unresolved_syms.
* coff64-rs6000.c (xcoff_ppc_relocate_section): Likewise.
* elf-bfd.h (_bfd_elf_large_com_section): Likewise.
* elf32-m32r.c (m32r_elf_relocate_section): Likewise.
* elf32-score.c (s3_bfd_score_elf_relocate_section): Likewise.
* elf32-score7.c (s7_bfd_score_elf_relocate_section): Likewise.
* elf32-sh.c (sh_elf_relocate_section): Likewise.
* elf32-spu.c (spu_elf_relocate_section): Likewise.
* elf64-hppa.c (elf64_hppa_relocate_section): Likewise.
* elflink.c (elf_link_output_extsym): Likewise.
* elfxx-mips.c (mips_elf_calculate_relocation): Likewise.

18 files changed:
bfd/ChangeLog
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
bfd/elf-bfd.h
bfd/elf32-m32r.c
bfd/elf32-score.c
bfd/elf32-score7.c
bfd/elf32-sh.c
bfd/elf32-spu.c
bfd/elf64-hppa.c
bfd/elflink.c
bfd/elfxx-mips.c
include/ChangeLog
include/bfdlink.h
ld/ChangeLog
ld/emultempl/aix.em
ld/emultempl/elf.em
ld/lexsup.c

index e837fdc133465b5c5eeeb2a126ebb907f819d3f6..2cf36f4c3e0a669e4fbf9112bf74c89f9146f7ec 100644 (file)
@@ -1,3 +1,19 @@
+2020-04-15  Fangrui Song <maskray@google.com>
+
+       PR binutils/24613
+       * coff-rs6000.c (xcoff_ppc_relocate_section): Change RM_GENERATE_ERROR
+       to RM_DIAGNOSE plus a check of warn_unresolved_syms.
+       * coff64-rs6000.c (xcoff_ppc_relocate_section): Likewise.
+       * elf-bfd.h (_bfd_elf_large_com_section): Likewise.
+       * elf32-m32r.c (m32r_elf_relocate_section): Likewise.
+       * elf32-score.c (s3_bfd_score_elf_relocate_section): Likewise.
+       * elf32-score7.c (s7_bfd_score_elf_relocate_section): Likewise.
+       * elf32-sh.c (sh_elf_relocate_section): Likewise.
+       * elf32-spu.c (spu_elf_relocate_section): Likewise.
+       * elf64-hppa.c (elf64_hppa_relocate_section): Likewise.
+       * elflink.c (elf_link_output_extsym): Likewise.
+       * elfxx-mips.c (mips_elf_calculate_relocation): Likewise.
+
 2020-04-15  Alan Modra  <amodra@gmail.com>
 
        PR 25823
index bf87596a4fe6da609c3a66f65d49e4063173ce3c..51fab9f0536309bcc8b952e6e0b5d9eabd4f5d57 100644 (file)
@@ -3389,7 +3389,8 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
                  (info, h->root.root.string,
                   input_bfd, input_section,
                   rel->r_vaddr - input_section->vma,
-                  info->unresolved_syms_in_objects == RM_GENERATE_ERROR);
+                  info->unresolved_syms_in_objects == RM_DIAGNOSE &&
+                      !info->warn_unresolved_syms);
 
              if (h->root.type == bfd_link_hash_defined
                  || h->root.type == bfd_link_hash_defweak)
index d34e25903ced4ffc2524c3d7e624e1d7ac90b241..7185232ce14b6d140354cdf095efb0a8b0b9cd02 100644 (file)
@@ -1249,10 +1249,11 @@ xcoff64_ppc_relocate_section (bfd *output_bfd,
            {
              if (info->unresolved_syms_in_objects != RM_IGNORE
                  && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
-               (*info->callbacks->undefined_symbol)
+                info->callbacks->undefined_symbol
                  (info, h->root.root.string, input_bfd, input_section,
                   rel->r_vaddr - input_section->vma,
-                  info->unresolved_syms_in_objects == RM_GENERATE_ERROR);
+                  info->unresolved_syms_in_objects == RM_DIAGNOSE
+                  && !info->warn_unresolved_syms);
 
              if (h->root.type == bfd_link_hash_defined
                  || h->root.type == bfd_link_hash_defweak)
index 03e2b6fe85a96baf7783a0d34ede7552a5d5e513..b08502cd1c4e5b6ac0ff9c9a6b686204e0969fad 100644 (file)
@@ -2930,8 +2930,9 @@ extern asection _bfd_elf_large_com_section;
       else if (!bfd_link_relocatable (info))                           \
        {                                                               \
          bfd_boolean err;                                              \
-         err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR  \
-                || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);       \
+         err = (info->unresolved_syms_in_objects == RM_DIAGNOSE &&     \
+                !info->warn_unresolved_syms)                           \
+                || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT;        \
          (*info->callbacks->undefined_symbol) (info,                   \
                                                h->root.root.string,    \
                                                input_bfd,              \
index 2a4b0b2ebea80d4bab414cb58ee00e62a74dcae6..598fbe5633b648f74962a93dfc936d08bb291536 100644 (file)
@@ -2551,12 +2551,12 @@ m32r_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            ;
          else if (!bfd_link_relocatable (info))
-           (*info->callbacks->undefined_symbol)
-             (info, h->root.root.string, input_bfd,
-              input_section, offset,
-              (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
-               || ELF_ST_VISIBILITY (h->other)));
-       }
+            info->callbacks->undefined_symbol
+             (info, h->root.root.string, input_bfd, input_section, offset,
+              (info->unresolved_syms_in_objects == RM_DIAGNOSE
+               && !info->warn_unresolved_syms)
+              || ELF_ST_VISIBILITY (h->other));
+        }
 
       if (sec != NULL && discarded_section (sec))
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
index 8c2e3042ae84fb7566ddc14c71ee5e8de5233eff..c5e6346e93ffd23e3f6c768586b44009b962be78 100644 (file)
@@ -2669,13 +2669,14 @@ s3_bfd_score_elf_relocate_section (bfd *output_bfd,
            }
          else if (!bfd_link_relocatable (info))
            {
-             (*info->callbacks->undefined_symbol)
-               (info, h->root.root.root.string, input_bfd,
-                input_section, rel->r_offset,
-                (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
+              info->callbacks->undefined_symbol
+               (info, h->root.root.root.string, input_bfd, input_section,
+                rel->r_offset,
+                (info->unresolved_syms_in_objects == RM_DIAGNOSE
+                 && !info->warn_unresolved_syms)
                 || ELF_ST_VISIBILITY (h->root.other));
-             relocation = 0;
-           }
+              relocation = 0;
+            }
        }
 
       if (sec != NULL && discarded_section (sec))
index 752796c45be9037b4a52b2659259378dbe82f44a..0f647feaeb8f0c8ca60da534ad71cc9ae16fe001 100644 (file)
@@ -2443,12 +2443,13 @@ s7_bfd_score_elf_relocate_section (bfd *output_bfd,
            }
          else if (!bfd_link_relocatable (info))
            {
-             (*info->callbacks->undefined_symbol)
-               (info, h->root.root.root.string, input_bfd,
-                input_section, rel->r_offset,
-                (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
+              info->callbacks->undefined_symbol
+               (info, h->root.root.root.string, input_bfd, input_section,
+                rel->r_offset,
+                (info->unresolved_syms_in_objects == RM_DIAGNOSE
+                 && !info->warn_unresolved_syms)
                 || ELF_ST_VISIBILITY (h->root.other));
-             relocation = 0;
+              relocation = 0;
            }
        }
 
index 9a00bde1d997b46011b3fb0b306a5d1ed2bc3f66..db07f8f889d924873a7cfbb16b22641b1cfc0f9e 100644 (file)
@@ -3815,12 +3815,13 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
            ;
          else if (!bfd_link_relocatable (info))
-           (*info->callbacks->undefined_symbol)
-             (info, h->root.root.string, input_bfd,
-              input_section, rel->r_offset,
-              (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
-               || ELF_ST_VISIBILITY (h->other)));
-       }
+            info->callbacks->undefined_symbol
+             (info, h->root.root.string, input_bfd, input_section,
+              rel->r_offset,
+              (info->unresolved_syms_in_objects == RM_DIAGNOSE
+               && !info->warn_unresolved_syms)
+              || ELF_ST_VISIBILITY (h->other));
+        }
 
       if (sec != NULL && discarded_section (sec))
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
index 711537d3de6e28fcd0b62b8d3ee14ac760767100..983989081aeb755edaead2456cfc1a93f561af91 100644 (file)
@@ -4927,13 +4927,14 @@ spu_elf_relocate_section (bfd *output_bfd,
                   && !(r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64))
            {
              bfd_boolean err;
-             err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
-                    || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);
-             (*info->callbacks->undefined_symbol) (info,
-                                                   h->root.root.string,
-                                                   input_bfd,
-                                                   input_section,
-                                                   rel->r_offset, err);
+
+             err = (info->unresolved_syms_in_objects == RM_DIAGNOSE
+                    && !info->warn_unresolved_syms)
+               || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT;
+
+             info->callbacks->undefined_symbol
+               (info, h->root.root.string, input_bfd,
+                input_section, rel->r_offset, err);
            }
          sym_name = h->root.root.string;
        }
index a2602daf2b1a2027be71fe5a88082efbc98f4e90..ae50b2cd4786b030d91d7b5872c6522eb002def1 100644 (file)
@@ -3882,13 +3882,14 @@ elf64_hppa_relocate_section (bfd *output_bfd,
          else if (!bfd_link_relocatable (info))
            {
              bfd_boolean err;
-             err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
-                    || ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT);
-             (*info->callbacks->undefined_symbol) (info,
-                                                   eh->root.root.string,
-                                                   input_bfd,
-                                                   input_section,
-                                                   rel->r_offset, err);
+
+             err = (info->unresolved_syms_in_objects == RM_DIAGNOSE
+                    && !info->warn_unresolved_syms)
+               || ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT;
+
+             info->callbacks->undefined_symbol
+               (info, eh->root.root.string, input_bfd,
+                input_section, rel->r_offset, err);
            }
 
          if (!bfd_link_relocatable (info)
@@ -3900,7 +3901,7 @@ elf64_hppa_relocate_section (bfd *output_bfd,
              if (info->unresolved_syms_in_objects == RM_IGNORE
                  && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
                  && eh->type == STT_PARISC_MILLI)
-               (*info->callbacks->undefined_symbol)
+               info->callbacks->undefined_symbol
                  (info, eh_name (eh), input_bfd,
                   input_section, rel->r_offset, FALSE);
            }
index 7c0849423a3d0eac6f4bbecb0135b127c8853519..eb6b3eeca50e986e8e6accb17de7031c9923c6cb 100644 (file)
@@ -9886,11 +9886,13 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
          && (!h->ref_regular || flinfo->info->gc_sections)
          && !elf_link_check_versioned_symbol (flinfo->info, bed, h)
          && flinfo->info->unresolved_syms_in_shared_libs != RM_IGNORE)
-       (*flinfo->info->callbacks->undefined_symbol)
-         (flinfo->info, h->root.root.string,
-          h->ref_regular ? NULL : h->root.u.undef.abfd,
-          NULL, 0,
-          flinfo->info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR);
+       {
+         flinfo->info->callbacks->undefined_symbol
+           (flinfo->info, h->root.root.string,
+            h->ref_regular ? NULL : h->root.u.undef.abfd, NULL, 0,
+            flinfo->info->unresolved_syms_in_shared_libs == RM_DIAGNOSE
+            && !flinfo->info->warn_unresolved_syms);
+       }
 
       /* Strip a global symbol defined in a discarded section.  */
       if (h->indx == -3)
index 4671b5044975a0f6710390035e0f38fe755a2f38..ae8478270efc37b0227e81f5e8bceb53e28d953d 100644 (file)
@@ -5649,11 +5649,12 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
        }
       else
        {
-         bfd_boolean reject_undefined
-           = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
-              || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT);
+          bfd_boolean reject_undefined
+           = (info->unresolved_syms_in_objects == RM_DIAGNOSE
+              && !info->warn_unresolved_syms)
+           || ELF_ST_VISIBILITY (h->root.other) != STV_DEFAULT;
 
-         (*info->callbacks->undefined_symbol)
+         info->callbacks->undefined_symbol
            (info, h->root.root.root.string, input_bfd,
             input_section, relocation->r_offset, reject_undefined);
 
index 97409d9bf18b0c566ed26bf9f954f71cef267942..42698b2dbcd9306ff2415698b12363a9af25899e 100644 (file)
@@ -1,3 +1,10 @@
+2020-04-10  Fangrui Song <maskray@google.com>
+
+       PR binutils/24613
+       * bfdlink.h (enum report_method): Delete RM_GENERATE_WARNING and
+       RM_GENERATE_ERROR. Add RM_DIAGNOSE.
+       (struct bfd_link_info): Add warn_unresolved_syms.
+
 2020-04-14  Stephen Casner  <casner@acm.org>
 
        PR ld/25677
index 84b9dd7a0a0edf35c7d8bc9cfebe7a2802ae32ce..ec97679e6f1de2a15202f33b3e153d02813b79ea 100644 (file)
@@ -270,8 +270,7 @@ enum report_method
      allowed to set the value.  */
   RM_NOT_YET_SET = 0,
   RM_IGNORE,
-  RM_GENERATE_WARNING,
-  RM_GENERATE_ERROR
+  RM_DIAGNOSE,
 };
 
 typedef enum {with_flags, without_flags} flag_type;
@@ -373,7 +372,7 @@ struct bfd_link_info
   ENUM_BITFIELD (bfd_link_elf_stt_common) elf_stt_common : 2;
 
   /* Criteria for skipping symbols when determining
-     whether to include an object from an archive. */
+     whether to include an object from an archive.  */
   ENUM_BITFIELD (bfd_link_common_skip_ar_symbols) common_skip_ar_symbols : 2;
 
   /* What to do with unresolved symbols in an object file.
@@ -387,6 +386,9 @@ struct bfd_link_info
      The same defaults apply.  */
   ENUM_BITFIELD (report_method) unresolved_syms_in_shared_libs : 2;
 
+  /* TRUE if unresolved symbols are to be warned, rather than errored.  */
+  unsigned int warn_unresolved_syms: 1;
+
   /* TRUE if shared objects should be linked directly, not shared.  */
   unsigned int static_link: 1;
 
index f53b2260846274a1d8867d53a9b2803e44ed6a1a..53a3c9d5dcd6ec93fdd4936f0054fa46220036ec 100644 (file)
@@ -1,3 +1,12 @@
+2020-04-15  Fangrui Song <maskray@google.com>
+
+       PR binutils/24613
+       * lexsup.c (parse_args): Change RM_GENERATE_WARNING and
+       RM_GENERATE_ERROR to RM_DIAGNOSE.
+       * emultempl/aix.em (ld_${EMULATION_NAME}_emulation): Change
+       RM_GENERATE_ERROR to RM_DIAGNOSE.
+       * emultempl/elf.em (ld_${EMULATION_NAME}_emulation): Likewise.
+
 2020-04-14  Stephen Casner  <casner@acm.org>
 
        PR ld/25677
index 2da3870989906055bceeb7a44739b1c177c78931..5b73c3e7e59aacc02d62dab7bda4941b2592002a 100644 (file)
@@ -472,8 +472,8 @@ gld${EMULATION_NAME}_handle_option (int optc)
       break;
 
     case OPTION_ERNOTOK:
-      link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
-      link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
+      link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
+      link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
       break;
 
     case OPTION_EROK:
index bb7e5375303869c4150cd223cde51d6b622a808a..899030016c0d8519f6edd4c5232ef338f60e4ff6 100644 (file)
@@ -675,8 +675,8 @@ fragment <<EOF
     case OPTION_GROUP:
       link_info.flags_1 |= (bfd_vma) DF_1_GROUP;
       /* Groups must be self-contained.  */
-      link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
-      link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
+      link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
+      link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
       break;
 
     case OPTION_EXCLUDE_LIBS:
@@ -704,7 +704,7 @@ fi
 fragment <<EOF
     case 'z':
       if (strcmp (optarg, "defs") == 0)
-       link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
+       link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
       else if (strcmp (optarg, "undefs") == 0)
        link_info.unresolved_syms_in_objects = RM_IGNORE;
       else if (strcmp (optarg, "muldefs") == 0)
index adbf2ab7a4eeb49f5d80282fec0958e17fdbed5b..d1955b9afaba8c94055617e741ff798cf24792ba 100644 (file)
@@ -569,7 +569,6 @@ parse_args (unsigned argc, char **argv)
   struct option *longopts;
   struct option *really_longopts;
   int last_optind;
-  enum report_method how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
   enum symbolic_enum
   {
     symbolic_unset = 0,
@@ -958,15 +957,13 @@ parse_args (unsigned argc, char **argv)
          link_info.keep_memory = FALSE;
          break;
        case OPTION_NO_UNDEFINED:
-         link_info.unresolved_syms_in_objects
-           = how_to_report_unresolved_symbols;
+         link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
          break;
        case OPTION_ALLOW_SHLIB_UNDEFINED:
          link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
          break;
        case OPTION_NO_ALLOW_SHLIB_UNDEFINED:
-         link_info.unresolved_syms_in_shared_libs
-           = how_to_report_unresolved_symbols;
+         link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
          break;
        case OPTION_UNRESOLVED_SYMBOLS:
          if (strcmp (optarg, "ignore-all") == 0)
@@ -976,40 +973,27 @@ parse_args (unsigned argc, char **argv)
            }
          else if (strcmp (optarg, "report-all") == 0)
            {
-             link_info.unresolved_syms_in_objects
-               = how_to_report_unresolved_symbols;
-             link_info.unresolved_syms_in_shared_libs
-               = how_to_report_unresolved_symbols;
+             link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
+             link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
            }
          else if (strcmp (optarg, "ignore-in-object-files") == 0)
            {
              link_info.unresolved_syms_in_objects = RM_IGNORE;
-             link_info.unresolved_syms_in_shared_libs
-               = how_to_report_unresolved_symbols;
+             link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
            }
          else if (strcmp (optarg, "ignore-in-shared-libs") == 0)
            {
-             link_info.unresolved_syms_in_objects
-               = how_to_report_unresolved_symbols;
+             link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
              link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
            }
          else
            einfo (_("%F%P: bad --unresolved-symbols option: %s\n"), optarg);
          break;
        case OPTION_WARN_UNRESOLVED_SYMBOLS:
-         how_to_report_unresolved_symbols = RM_GENERATE_WARNING;
-         if (link_info.unresolved_syms_in_objects == RM_GENERATE_ERROR)
-           link_info.unresolved_syms_in_objects = RM_GENERATE_WARNING;
-         if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
-           link_info.unresolved_syms_in_shared_libs = RM_GENERATE_WARNING;
+         link_info.warn_unresolved_syms = TRUE;
          break;
-
        case OPTION_ERROR_UNRESOLVED_SYMBOLS:
-         how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
-         if (link_info.unresolved_syms_in_objects == RM_GENERATE_WARNING)
-           link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
-         if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_WARNING)
-           link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
+         link_info.warn_unresolved_syms = FALSE;
          break;
        case OPTION_ALLOW_MULTIPLE_DEFINITION:
          link_info.allow_multiple_definition = TRUE;
@@ -1639,11 +1623,11 @@ parse_args (unsigned argc, char **argv)
 
   if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
     /* FIXME: Should we allow emulations a chance to set this ?  */
-    link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
+    link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
 
   if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
     /* FIXME: Should we allow emulations a chance to set this ?  */
-    link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
+    link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
 
   if (bfd_link_relocatable (&link_info)
       && command_line.check_section_addresses < 0)
This page took 0.045591 seconds and 4 git commands to generate.