Index: chrome/nacl.gypi |
diff --git a/chrome/nacl.gypi b/chrome/nacl.gypi |
index abfab38f0a8b9d44794042964f999cbd131ff71d..42c0035bca71340879ddf62d693453a9cb33d077 100644 |
--- a/chrome/nacl.gypi |
+++ b/chrome/nacl.gypi |
@@ -183,9 +183,7 @@ |
['OS=="linux"', { |
'targets': [ |
{ |
- 'target_name': 'nacl_helper.so', |
- # 'executable' will be overridden below when we add the -shared |
- # flag; here it prevents gyp from using the --whole-archive flag |
+ 'target_name': 'nacl_helper', |
'type': 'executable', |
'include_dirs': [ |
'..', |
@@ -194,7 +192,7 @@ |
'nacl', |
], |
'sources': [ |
- '../chrome/nacl/nacl_helper_linux.cc', |
+ 'nacl/nacl_helper_linux.cc', |
], |
'conditions': [ |
['toolkit_uses_gtk == 1', { |
@@ -203,36 +201,108 @@ |
], |
}], |
], |
+ 'cflags': ['-fPIE'], |
'link_settings': { |
- # NOTE: '-shared' overrides 'executable' above |
- 'ldflags': ['-shared', |
- '-Wl,--version-script=chrome/nacl/nacl_helper_exports.txt', |
- ], |
+ 'ldflags': ['-pie'], |
}, |
}, |
{ |
- 'target_name': 'nacl_helper_bootstrap', |
+ 'target_name': 'nacl_helper_bootstrap_munge_phdr', |
'type': 'executable', |
- 'dependencies': [ |
- 'nacl_helper.so', |
+ 'toolsets': ['host'], |
+ 'sources': [ |
+ 'nacl/nacl_helper_bootstrap_munge_phdr.c', |
+ ], |
+ 'libraries': [ |
+ '-lelf', |
+ ], |
+ # This is an ugly kludge because gyp doesn't actually treat |
+ # host_arch=x64 target_arch=ia32 as proper cross compilation. |
+ # It still wants to compile the "host" program with -m32 et |
+ # al. Though a program built that way can indeed run on the |
+ # x86-64 host, we cannot reliably build this program on such a |
+ # host because Ubuntu does not provide the full suite of |
+ # x86-32 libraries in packages that can be installed on an |
+ # x86-64 host; in particular, libelf is missing. So here we |
+ # use the hack of eliding all the -m* flags from the |
+ # compilation lines, getting the command close to what they |
+ # would be if gyp were to really build properly for the host. |
+ # TODO(bradnelson): Clean up with proper cross support. |
+ 'conditions': [ |
+ ['host_arch=="x64"', { |
+ 'cflags/': [['exclude', '-m.*']], |
+ 'ldflags/': [['exclude', '-m.*']], |
+ }], |
+ ], |
+ }, |
+ { |
+ 'target_name': 'nacl_helper_bootstrap_raw', |
+ 'type': 'executable', |
+ 'include_dirs': [ |
+ '..', |
], |
'sources': [ |
- '../chrome/nacl/nacl_helper_bootstrap_linux.c', |
+ 'nacl/nacl_helper_bootstrap_linux.c', |
+ # We list the linker script here for documentation purposes. |
+ # But even this doesn't make gyp treat it as a dependency, |
+ # so incremental builds won't relink when the script changes. |
+ # TODO(bradnelson): Fix the dependency handling. |
+ 'nacl/nacl_helper_bootstrap_linux.x', |
+ ], |
+ 'cflags': [ |
+ # The tiny standalone bootstrap program is incompatible with |
+ # -fstack-protector, which might be on by default. That switch |
+ # requires using the standard libc startup code, which we do not. |
+ '-fno-stack-protector', |
+ # We don't want to compile it PIC (or its cousin PIE), because |
+ # it goes at an absolute address anyway, and because any kind |
+ # of PIC complicates life for the x86-32 assembly code. We |
+ # append -fno-* flags here instead of using a 'cflags!' stanza |
+ # to remove -f* flags, just in case some system's compiler |
+ # defaults to using PIC for everything. |
+ '-fno-pic', '-fno-PIC', |
+ '-fno-pie', '-fno-PIE', |
], |
- # TODO(bradchen): Delete the -B argument when Gold supports |
- # -Ttext properly. Until then use ld.bfd. |
'link_settings': { |
- 'ldflags': ['-B', 'tools/ld_bfd', |
- # Force text segment at 0x10000 (64KB) |
- # The max-page-size option is needed on x86-64 linux |
- # where 4K pages are not the default in the BFD linker. |
- '-Wl,-Ttext-segment,10000,-z,max-page-size=0x1000', |
- # reference nacl_helper as a shared library |
- '<(PRODUCT_DIR)/nacl_helper.so', |
- '-Wl,-rpath,<(SHARED_LIB_DIR)', |
- ], |
+ 'ldflags': [ |
+ # TODO(bradchen): Delete the -B argument when Gold is verified |
+ # to produce good results with our custom linker script. |
+ # Until then use ld.bfd. |
+ '-B', 'tools/ld_bfd', |
+ # This programs is (almost) entirely standalone. It has |
+ # its own startup code, so no crt1.o for it. It is |
+ # statically linked, and on x86 it actually does not use |
+ # libc at all. However, on ARM it needs a few (safe) |
+ # things from libc, so we don't use '-nostdlib' here. |
+ '-static', '-nostartfiles', |
+ # Link with our custom linker script to get out special layout. |
+ # TODO(bradnelson): Use some <(foo) instead of chrome/ here. |
+ '-Wl,--script=chrome/nacl/nacl_helper_bootstrap_linux.x', |
+ # On x86-64, the default page size with some |
+ # linkers is 2M rather than the real Linux page |
+ # size of 4K. A larger page size is incompatible |
+ # with our custom linker script's special layout. |
+ '-Wl,-z,max-page-size=0x1000', |
+ ], |
}, |
}, |
+ { |
+ 'target_name': 'nacl_helper_bootstrap', |
+ 'dependencies': [ |
+ 'nacl_helper_bootstrap_raw', |
+ 'nacl_helper_bootstrap_munge_phdr#host', |
+ ], |
+ 'type': 'none', |
+ 'actions': [{ |
+ 'action_name': 'munge_phdr', |
+ 'inputs': ['nacl/nacl_helper_bootstrap_munge_phdr.py', |
+ '<(PRODUCT_DIR)/nacl_helper_bootstrap_munge_phdr', |
+ '<(PRODUCT_DIR)/nacl_helper_bootstrap_raw'], |
+ 'outputs': ['<(PRODUCT_DIR)/nacl_helper_bootstrap'], |
+ 'message': 'Munging ELF program header', |
+ 'action': ['python', '<@(_inputs)', '<@(_outputs)'] |
+ }], |
+ } |
], |
}], |
], |