2007-05-09 Robert Connolly * bfd/elflink.c (bfd_elf_final_link): Added code to handle --error-shared-textrel, which causes an error if DT_TEXTREL is created in a shared object. * include/bfdlink.h (bfd_link_info): Add boolean error_shared_textrel. * ld/NEWS: Mention new --error-shared-textrel option. * ld/ld.texinfo: Document --error-shared-textrel. * ld/lexsup.c: Added support for --error-shared-textrel. * ld/testsuite/ld-i386/i386.exp: Added warn2 test. * ld/testsuite/ld-i386/warn2.d: Cloned warn1.d to test --error-shared-textrel. * ld/testsuite/ld-i386/warn2.s: Likewise. diff -Naur binutils-20070509.orig/bfd/elflink.c binutils-20070509/bfd/elflink.c --- binutils-20070509.orig/bfd/elflink.c 2007-05-07 14:47:28.000000000 +0000 +++ binutils-20070509/bfd/elflink.c 2007-05-09 21:52:05.000000000 +0000 @@ -10094,7 +10094,8 @@ goto error_return; /* Check for DT_TEXTREL (late, in case the backend removes it). */ - if (info->warn_shared_textrel && info->shared) + if ((info->warn_shared_textrel || info->error_shared_textrel) + && info->shared) { bfd_byte *dyncon, *dynconend; @@ -10112,9 +10113,18 @@ if (dyn.d_tag == DT_TEXTREL) { - info->callbacks->einfo - (_("%P: warning: creating a DT_TEXTREL in a shared object.\n")); - break; + if (info->error_shared_textrel) + { + info->callbacks->einfo + (_("%P: error: creating a DT_TEXTREL in a shared object.\n")); + goto error_return; + } + else + { + info->callbacks->einfo + (_("%P: warning: creating a DT_TEXTREL in a shared object.\n")); + break; + } } } } diff -Naur binutils-20070509.orig/include/bfdlink.h binutils-20070509/include/bfdlink.h --- binutils-20070509.orig/include/bfdlink.h 2007-04-30 14:06:40.000000000 +0000 +++ binutils-20070509/include/bfdlink.h 2007-05-09 19:30:45.000000000 +0000 @@ -323,6 +323,9 @@ /* TRUE if we should warn when adding a DT_TEXTREL to a shared object. */ unsigned int warn_shared_textrel: 1; + /* TRUE if we should error when adding a DT_TEXTREL to a shared object. */ + unsigned int error_shared_textrel: 1; + /* TRUE if unreferenced sections should be removed. */ unsigned int gc_sections: 1; diff -Naur binutils-20070509.orig/ld/NEWS binutils-20070509/ld/NEWS --- binutils-20070509.orig/ld/NEWS 2007-03-29 17:16:05.000000000 +0000 +++ binutils-20070509/ld/NEWS 2007-05-09 20:44:08.000000000 +0000 @@ -1,4 +1,7 @@ -*- text -*- +* ELF: Added --error-shared-textrel option to cause an error if + DT_TEXTREL is being created in a shared object. + * -l:foo now searches the library path for a filename called foo, without converting it to libfoo.a or libfoo.so. diff -Naur binutils-20070509.orig/ld/ld.texinfo binutils-20070509/ld/ld.texinfo --- binutils-20070509.orig/ld/ld.texinfo 2007-05-03 09:24:16.000000000 +0000 +++ binutils-20070509/ld/ld.texinfo 2007-05-09 19:30:45.000000000 +0000 @@ -1867,6 +1867,10 @@ @item --warn-shared-textrel Warn if the linker adds a DT_TEXTREL to a shared object. +@kindex --error-shared-textrel +@item --error-shared-textrel +Error if the linker adds a DT_TEXTREL to a shared object. + @kindex --warn-unresolved-symbols @item --warn-unresolved-symbols If the linker is going to report an unresolved symbol (see the option diff -Naur binutils-20070509.orig/ld/lexsup.c binutils-20070509/ld/lexsup.c --- binutils-20070509.orig/ld/lexsup.c 2007-05-03 09:24:16.000000000 +0000 +++ binutils-20070509/ld/lexsup.c 2007-05-09 19:44:08.000000000 +0000 @@ -161,6 +161,7 @@ OPTION_WARN_UNRESOLVED_SYMBOLS, OPTION_ERROR_UNRESOLVED_SYMBOLS, OPTION_WARN_SHARED_TEXTREL, + OPTION_ERROR_SHARED_TEXTREL, OPTION_REDUCE_MEMORY_OVERHEADS, OPTION_DEFAULT_SCRIPT }; @@ -541,6 +542,9 @@ { {"warn-shared-textrel", no_argument, NULL, OPTION_WARN_SHARED_TEXTREL}, '\0', NULL, N_("Warn if shared object has DT_TEXTREL"), TWO_DASHES }, + { {"error-shared-textrel", no_argument, NULL, OPTION_ERROR_SHARED_TEXTREL}, + '\0', NULL, N_("Error if shared object has DT_TEXTREL"), + TWO_DASHES }, { {"warn-unresolved-symbols", no_argument, NULL, OPTION_WARN_UNRESOLVED_SYMBOLS}, '\0', NULL, N_("Report unresolved symbols as warnings"), TWO_DASHES }, @@ -1329,6 +1333,9 @@ case OPTION_WARN_SHARED_TEXTREL: link_info.warn_shared_textrel = TRUE; break; + case OPTION_ERROR_SHARED_TEXTREL: + link_info.error_shared_textrel = TRUE; + break; case OPTION_WHOLE_ARCHIVE: whole_archive = TRUE; break; diff -Naur binutils-20070509.orig/ld/testsuite/ld-i386/i386.exp binutils-20070509/ld/testsuite/ld-i386/i386.exp --- binutils-20070509.orig/ld/testsuite/ld-i386/i386.exp 2007-04-05 16:16:28.000000000 +0000 +++ binutils-20070509/ld/testsuite/ld-i386/i386.exp 2007-05-09 19:54:30.000000000 +0000 @@ -116,3 +116,4 @@ run_dump_test "pcrel16abs" run_dump_test "alloc" run_dump_test "warn1" +run_dump_test "warn2" diff -Naur binutils-20070509.orig/ld/testsuite/ld-i386/warn2.d binutils-20070509/ld/testsuite/ld-i386/warn2.d --- binutils-20070509.orig/ld/testsuite/ld-i386/warn2.d 1970-01-01 00:00:00.000000000 +0000 +++ binutils-20070509/ld/testsuite/ld-i386/warn2.d 2007-05-09 21:01:34.000000000 +0000 @@ -0,0 +1,4 @@ +#name: --error-shared-textrel +#as: --32 +#ld: -shared -melf_i386 --error-shared-textrel +#error: .*error: creating a DT_TEXTREL in a shared object. diff -Naur binutils-20070509.orig/ld/testsuite/ld-i386/warn2.s binutils-20070509/ld/testsuite/ld-i386/warn2.s --- binutils-20070509.orig/ld/testsuite/ld-i386/warn2.s 1970-01-01 00:00:00.000000000 +0000 +++ binutils-20070509/ld/testsuite/ld-i386/warn2.s 2007-05-09 19:52:08.000000000 +0000 @@ -0,0 +1,5 @@ + .text + .globl foo + .type foo, @function +foo: + movl bar, %eax