summaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
...
| * Add '--allowed-rpath-prefixes' option to '--shrink-rpath'Tuomas Tynkkynen2016-06-035-7/+88
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fixes #97. In essence, the problem is that some packages in Nixpkgs have RPATHs pointing to both $NIX_BUILD_TOP and $out, e.g.: /tmp/nix-build-openldap-2.4.44.drv-0/openldap-2.4.44/libraries/libldap_r/.libs /tmp/nix-build-openldap-2.4.44.drv-0/openldap-2.4.44/libraries/liblber/.libs /nix/store/bfkmdxmv3a3f0g3d2q8jkdz2wam93c5z-openldap-2.4.44/lib /nix/store/bfkmdxmv3a3f0g3d2q8jkdz2wam93c5z-openldap-2.4.44/lib64 Currently, running `patchelf --shrink-rpath` does the wrong thing by keeping the /tmp/ paths and deleting the /nix/store ones. Now we can fix the problem by using patchelf --shrink-rpath --allowed-rpath-prefixes $NIX_STORE_DIR in the Nixpkgs fixupPhase instead.
| * Extract a function for splitting a colon-separated stringTuomas Tynkkynen2016-06-031-9/+19
|/ | | | | We're going to need this logic in another place, so make a function of this.
* ` -> 'Eelco Dolstra2016-05-031-32/+32
|
* Improve "cannot find section" error messageEelco Dolstra2016-05-031-1/+1
| | | | Issue #66
* Merge pull request #83 from chewi/patch-1Eelco Dolstra2016-04-281-1/+1
|\ | | | | Make tests run in serial as they break in parallel
| * Make tests run in serial as they break in parallelJames Le Cuirot2016-03-171-1/+1
| | | | | | It would be nice to fix them in parallel but I lack the time.
* | Merge pull request #81 from fsateler/force-pagesizeEelco Dolstra2016-04-281-4/+5
|\ \ | | | | | | no-rpath-prebuild: force pagesize to 4096 on prebuilt binaries
| * | no-rpath-prebuild: force pagesize to 4096 on prebuilt binariesFelipe Sateler2016-02-291-4/+5
| |/ | | | | | | | | They all have that page size, and the host-detected one might be different.
* | Merge pull request #86 from njsmith/masterEelco Dolstra2016-04-281-1/+1
|\ \ | | | | | | Fix bug in walking .gnu.version_r linked list
| * | Fix bug in walking .gnu.version_r linked listNathaniel J. Smith2016-04-021-1/+1
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When writing the code to teach --replace-needed to modify the .gnu.version_r section (gh-85), I misunderstood how the ->vn_next pointers in the Elf_Verneed structs are supposed to be interpreted: I thought they gave an offset from the beginning of the section, but in fact they give an offset relative to the current struct. The resulting bug was very odd: generally, patchelf would complete without signalling an error, but it would only successfully replace filenames that occurred as either the first or second entries in the .gnu.version_r section, while the third or later entries would be left untouched. This commit fixes the interpretation of the ->vn_next pointers, so that now --replace-needed should work correctly even on ELF files with more than two version needed structs. Thanks to @matthew-brett for finding the bug / providing a test case, and to @rmcgibbo for helping me diagnose it.
* | Merge pull request #85 from njsmith/masterEelco Dolstra2016-04-011-6/+59
|\ \ | |/ |/| Teach --replace-needed to update .gnu.version_r table
| * Small cleanups to replaceNeededNathaniel J. Smith2016-04-011-14/+37
| | | | | | | | | | | | No semantic changes, but I noticed some small errors in the DT_NEEDED handling loop while I was adding the .gnu.version_r handling, so might as well fix them while I'm here.
| * Teach --replace-needed to update .gnu.version_r tableNathaniel J. Smith2016-04-011-4/+34
|/ | | | | | | | | | | | | | | | | | If the ELF binary that we're patching is linked to a DSO that uses symbol versioning, then the DSO's SONAME appears in two different places: once as a DT_NEEDED entry, and once in the .gnu.version_r version requirements section. Previously, patchelf --replace-needed would update DT_NEEDED entry, but fail to update the .gnu.version_r table. This resulted in completely broken binaries -- trying to load them would trigger an assertion failure inside the dynamic loader, as it tries to check the version of a library that was never loaded: Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed! This commit teaches --replace-needed to update the .gnu.version_r table. Fixes: gh-84
* Update README0.9Eelco Dolstra2016-02-291-1/+13
|
* Disable Darwin buildEelco Dolstra2016-02-291-2/+2
| | | | | | Currently failing due to some 15.09 libxml2 issue. http://hydra.nixos.org/build/32429886
* Bump versionEelco Dolstra2016-02-271-1/+1
|
* Fix Hydra evalEelco Dolstra2016-02-271-58/+8
|
* rewriteHeaders(): Don't assume PT_PHDR is the first program headerTuomas Tynkkynen2016-02-221-5/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Because this assumption doesn't seem to be valid either in theory or practice: the spec (http://refspecs.linuxbase.org/elf/elf.pdf) only places these requirements on PT_PHDR: "This segment type may not occur more than once in a file. Moreover, it may occur only if the program header table is part of the memory image of the program. If it is present, it must precede any loadable segment entry." And on ARM, binaries generated by GNU GCC / binutils almost never have PT_PHDR as the first entry, e.g. the coreutils 'ls' has this: Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x0169b4 0x0001e9b4 0x0001e9b4 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00008034 0x00008034 0x00120 0x00120 R E 0x4 INTERP 0x000154 0x00008154 0x00008154 0x0004f 0x0004f R 0x1 [Requesting program interpreter: /nix/store/whcad4dnkp5pnhbv4p0f9k8srv0kmcjk-glibc-2.21/lib/ld-linux-armhf.so.3] LOAD 0x000000 0x00008000 0x00008000 0x169c0 0x169c0 R E 0x8000 LOAD 0x0169c0 0x000269c0 0x000269c0 0x003f4 0x01088 RW 0x8000 DYNAMIC 0x0169cc 0x000269cc 0x000269cc 0x000f8 0x000f8 RW 0x4 NOTE 0x0001a4 0x000081a4 0x000081a4 0x00020 0x00020 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 PAX_FLAGS 0x000000 0x00000000 0x00000000 0x00000 0x00000 0x4 This problem has existed for quite a long time on ARM and often results in patchelf'd programs segfaulting inside the glibc dynamic linker, which relies on PT_PHDR containing valid contents. This has been worked around in Nixpkgs in various creative ways, like: https://github.com/NixOS/nixpkgs/blob/5c20877d40726b6973d222f71fa6e306428c19cf/nixos/modules/system/boot/stage-1.nix#L109 Applying patchelf twice did actually work in practice due to the fact that patchelf sorts the program headers, causing the first round of patchelf to rewrite an invalid PT_PHDR to appear first, and then the second round of patchelf fixing that PT_PHDR.
* Fix PAGESIZE auto-determinationEelco Dolstra2016-02-221-11/+11
| | | | | Don't use "which" (which might not exist), and don't redirect getconf auto to /dev/null.
* Merge branch 'pagesize' of https://github.com/fsateler/patchelfEelco Dolstra2016-02-223-9/+28
|\
| * Allow overriding pagesize at runtime via a command-line argumentFelipe Sateler2016-01-152-2/+11
| |
| * Allow specifying page size at configure timeFelipe Sateler2016-01-152-7/+19
| |
| * Remove stale sysconf configure checkFelipe Sateler2016-01-151-2/+0
| |
* | Add a license headerdarealshinji2016-02-221-0/+18
|/ | | | Because why not?
* Don't use dynamic page sizeEelco Dolstra2016-01-081-3/+4
| | | | | | | | | | This mostly reverts 08050dd5e3701b29e5628e1ec7d37c1cd6529c57 (#54) because the page size of the host is not necessarily the same as the page size of the binary. For a proper fix, we'll need some way to determine the page size of the binary, but ELF doesn't readily provide this information. Fixes #69.
* Merge branch 'print-needed' of https://github.com/darealshinji/patchelfEelco Dolstra2016-01-081-2/+27
|\
| * Add --print-needed command to list all DT_NEEDED entries of a filedarealshinji2015-07-241-2/+27
| |
* | Merge branch 'patch-1' of https://github.com/darealshinji/patchelfEelco Dolstra2016-01-081-0/+10
|\ \
| * | Document three missing commands in manpagedarealshinji2015-07-241-0/+10
| |/ | | | | | | | | --print-soname --set-soname --remove-rpath
* | Merge branch 'patch-2' of https://github.com/darealshinji/patchelfEelco Dolstra2016-01-081-1/+1
|\ \
| * | Description of `--set-soname' commanddarealshinji2015-07-241-1/+1
| |/ | | | | `--set-soname` now creates a new DT_SONAME entry if it doesn't exist.
* | Merge branch 'patch-3' of https://github.com/darealshinji/patchelfEelco Dolstra2016-01-081-8/+5
|\ \
| * | Remove unused parameter `fileMode'darealshinji2015-07-241-8/+5
| |/ | | | | | | I forgot to do that with this commit: https://github.com/NixOS/patchelf/commit/8eb28c00b6a78928cfa91728b1eba911a4ef49c1 Warnings only appear if -Wextra is turned on.
* | Merge branch 'patch-4' of https://github.com/darealshinji/patchelfEelco Dolstra2016-01-081-3/+3
|\ \
| * | Remaining sing-compare warningsdarealshinji2015-11-291-3/+3
| | | | | | | | | Get rid of remaining sing-compare warnings that appear when using gcc 5.2.
* | | Build on more recent Ubuntu / FedoraEelco Dolstra2015-11-251-0/+8
|/ /
* | Merge pull request #65 from AaronDMarasco-VSI/masterEelco Dolstra2015-09-111-6/+6
|\ \ | |/ |/| Use location macros
| * Less autotools, more RPM. Also escaped commented out %.Aaron D. Marasco2015-09-111-3/+3
| |
| * Use location macrosAaron D. Marasco2015-09-111-4/+4
|/ | | | Fixes %files bug when prefix is not "/usr"
* PR #40 had the side-effect of fixing the ia64 testEelco Dolstra2015-07-231-2/+0
|
* Merge branch 'skip-missing' of https://github.com/ttuegel/patchelfEelco Dolstra2015-07-231-3/+10
|\
| * Allow DT_REL without .rel.dyn or .rel.gotThomas Tuegel2014-09-121-3/+10
| | | | | | | | | | Some DT_REL files are missing both .rel.dyn and .rel.got. This doesn't seem to be an error, so it shouldn't be treated as such.
* | Merge branch 'move-sections' of https://github.com/ttuegel/patchelfEelco Dolstra2015-07-231-5/+16
|\ \
| * | Move section headers if they would be overwrittenThomas Tuegel2014-09-121-5/+16
| |/ | | | | | | | | | | | | When rewriting the sections of an executable, it can happen that the section headers occur too early in the file and would be overwritten by the replaced sections. If this would happen, we move the section headers to the end of the file.
* | Merge branch 'patch-3' of https://github.com/darealshinji/patchelfmodEelco Dolstra2015-07-231-1/+31
|\ \
| * | Add '--remove-rpath' optiondarealshinji2015-07-131-1/+31
| | |
* | | Merge branch 'patch-2' of https://github.com/darealshinji/patchelfmodEelco Dolstra2015-07-233-60/+80
|\ \ \
| * | | soname test: set an initial DT_SONAME entrydarealshinji2015-07-131-1/+10
| | | |
| * | | tests: build libsimple without sonamedarealshinji2015-07-131-1/+1
| | | |
| * | | Create new soname entry if shlib is missing one, merge modifySoname() and ↵darealshinji2015-07-131-58/+69
| |/ / | | | | | | | | | | | | getSoname() Basically this is just a modified copy of the rpath code