diff --git a/build/autoconf/expandlibs.m4 b/build/autoconf/expandlibs.m4 index b0fc6caf9537..70bc153e6678 100644 --- a/build/autoconf/expandlibs.m4 +++ b/build/autoconf/expandlibs.m4 @@ -14,25 +14,32 @@ dnl ======================================================== AC_CACHE_CHECK(what kind of list files are supported by the linker, moz_cv_expand_libs_list_style, [echo "int main() {return 0;}" > conftest.${ac_ext} - if AC_TRY_COMMAND(${CC-cc} -o conftest.${OBJ_SUFFIX} -c $CFLAGS $CPPFLAGS conftest.${ac_ext} 1>&5) && test -s conftest.${OBJ_SUFFIX}; then + dnl Because BFD ld doesn't work with LTO + linker scripts, we + dnl must pass the LTO CFLAGS to the compile command, and the LTO + dnl LDFLAGS to all subsequent link commands. + dnl https://sourceware.org/bugzilla/show_bug.cgi?id=23600 + if AC_TRY_COMMAND(${CC-cc} -o conftest.${OBJ_SUFFIX} -c $MOZ_LTO_CFLAGS $CFLAGS $CPPFLAGS conftest.${ac_ext} 1>&5) && test -s conftest.${OBJ_SUFFIX}; then + echo "INPUT(conftest.${OBJ_SUFFIX})" > conftest.list if test "$CC_TYPE" = "clang-cl"; then link="$LINKER -OUT:conftest${ac_exeext}" else link="${CC-cc} -o conftest${ac_exeext}" fi - echo "conftest.${OBJ_SUFFIX}" > conftest.list - if AC_TRY_COMMAND($link $LDFLAGS [-Wl,@conftest.list] $LIBS 1>&5) && test -s conftest${ac_exeext}; then - moz_cv_expand_libs_list_style=linkerlist - - dnl -filelist is for the OS X linker. We need to try -filelist first - dnl because clang understands @file, but may pass an oversized argument - dnl list to the linker depending on the contents of @file. - elif AC_TRY_COMMAND($link $LDFLAGS [-Wl,-filelist,conftest.list] $LIBS 1>&5) && test -s conftest${ac_exeext}; then - moz_cv_expand_libs_list_style=filelist - elif AC_TRY_COMMAND($link $LDFLAGS [@conftest.list] $LIBS 1>&5) && test -s conftest${ac_exeext}; then - moz_cv_expand_libs_list_style=list + if AC_TRY_COMMAND($link $MOZ_LTO_LDFLAGS $LDFLAGS conftest.list $LIBS 1>&5) && test -s conftest${ac_exeext}; then + moz_cv_expand_libs_list_style=linkerscript else - AC_ERROR([Couldn't find one that works]) + echo "conftest.${OBJ_SUFFIX}" > conftest.list + dnl -filelist is for the OS X linker. We need to try -filelist + dnl first because clang understands @file, but may pass an + dnl oversized argument list to the linker depending on the + dnl contents of @file. + if AC_TRY_COMMAND($link $MOZ_LTO_LDFLAGS $LDFLAGS [-Wl,-filelist,conftest.list] $LIBS 1>&5) && test -s conftest${ac_exeext}; then + moz_cv_expand_libs_list_style=filelist + elif AC_TRY_COMMAND($link $MOZ_LTO_LDFLAGS $LDFLAGS @conftest.list $LIBS 1>&5) && test -s conftest${ac_exeext}; then + moz_cv_expand_libs_list_style=list + else + AC_ERROR([Couldn't find one that works]) + fi fi else dnl We really don't expect to get here, but just in case diff --git a/python/mozbuild/mozbuild/backend/common.py b/python/mozbuild/mozbuild/backend/common.py index 3e14484a3035..9fe9d06e8efd 100644 --- a/python/mozbuild/mozbuild/backend/common.py +++ b/python/mozbuild/mozbuild/backend/common.py @@ -325,13 +325,15 @@ class CommonBackend(BuildBackend): list_style = "list" list_file_path = mozpath.join(objdir, name) objs = [os.path.relpath(o, objdir) for o in objs] - content = "\n".join(objs) - if list_style == "filelist": + if list_style == "linkerscript": + ref = list_file_path + content = "\n".join('INPUT("%s")' % o for o in objs) + elif list_style == "filelist": ref = "-Wl,-filelist," + list_file_path - elif list_style == "linkerlist": - ref = "-Wl,@" + list_file_path + content = "\n".join(objs) elif list_style == "list": ref = "@" + list_file_path + content = "\n".join(objs) else: return None diff --git a/toolkit/library/gen_buildid.py b/toolkit/library/gen_buildid.py index 0078a5cfd6ae..9943ad253910 100644 --- a/toolkit/library/gen_buildid.py +++ b/toolkit/library/gen_buildid.py @@ -18,7 +18,16 @@ from mozbuild.preprocessor import Preprocessor def main(output, input_file): with open(input_file) as fh: - objs = [l.strip() for l in fh.readlines()] + if buildconfig.substs["EXPAND_LIBS_LIST_STYLE"] == "linkerscript": + + def cleanup(line): + assert line.startswith('INPUT("') + assert line.endswith('")') + return line[len('INPUT("') : -len('")')] + + objs = [cleanup(l.strip()) for l in fh.readlines()] + else: + objs = [l.strip() for l in fh.readlines()] pp = Preprocessor() pp.out = StringIO()