1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 01:15:29 +02:00

Bug 512822: "Launch failed. Binary not found" even after building

Builds upon https://git.eclipse.org/r/#/c/92129/ but also uses the hints
to only read the file if necessary. I further reverted some of
the changes done with the patch for 'Bug 510987 - Properly support PIE
executables as build output' since the binary will now be seen as an
executable anyway.

Change-Id: I075fef67f3b101ddbc64786dcbc2ca41cc114e25
Signed-off-by: Hansruedi Patzen <hansruedi.patzen@hsr.ch>
This commit is contained in:
Hansruedi Patzen 2018-09-24 20:38:07 +02:00 committed by Doug Schaefer
parent 45a30f5967
commit 920f5e3a7f
39 changed files with 1210 additions and 59 deletions

View file

@ -0,0 +1,172 @@
/*******************************************************************************
* Copyright (c) 2018 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hansruedi Patzen (IFS) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.utils.elf;
import java.io.FileInputStream;
import java.io.IOException;
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.utils.elf.parser.ElfBinaryExecutable;
import org.eclipse.cdt.utils.elf.parser.ElfBinaryShared;
import org.eclipse.cdt.utils.elf.parser.ElfParser;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class ElfParserTest extends TestCase {
ElfParser elfParser;
public static Test suite() {
return new TestSuite(ElfParserTest.class);
}
@Override
protected void setUp() throws Exception {
elfParser = new ElfParser();
super.setUp();
}
private byte[] readHints(final IPath path) throws IOException {
int bytesToRead = elfParser.getHintBufferSize();
byte[] hints = new byte[bytesToRead];
try (FileInputStream is = new FileInputStream(path.toFile())) {
is.read(hints);
}
return hints;
}
/*
* The most probable cause for failing one of the following tests
*
* testLE64DYNwithInterpELFoutsideHintsError_Bug512822
* testLE32DYNwithInterpELFoutsideHintsError_Bug512822
*
* is that the hint buffer size has been changed and the test binaries
* are too small and need to be updated to reflect this change as well.
*
* The original files have been manually created using nasm. See the
* *.asm files inside resources/elf/{inside_hints,outside_hints}/ for
* further details.
*/
public void testLE64DYNwithInterpELFoutsideHintsError_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/le64");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertFalse("Binary should not be an executable", binary instanceof ElfBinaryExecutable);
}
public void testLE32DYNwithInterpELFoutsideHintsError_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/le32");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertFalse("Binary should not be an executable", binary instanceof ElfBinaryExecutable);
}
public void testLE64DYNwithInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/le64");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testLE32DYNwithInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/le32");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testLE64DYNwithInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/le64");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testLE32DYNwithInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/le32");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testLE32DYNnoInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/le32lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
public void testLE64DYNnoInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/le64lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
public void testLE32DYNnoInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/le32lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
public void testLE64DYNnoInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/le64lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
public void testBE64DYNwithInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/be64");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testBE32DYNwithInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/be32");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testBE64DYNwithInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/be64");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testBE32DYNwithInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/be32");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be an executable", binary instanceof ElfBinaryExecutable);
}
public void testBE32DYNnoInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/be32lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
public void testBE64DYNnoInterpELFinsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/inside_hints/be64lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), new Path(""));
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
public void testBE32DYNnoInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/be32lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
public void testBE64DYNnoInterpELFoutsideHints_Bug512822() throws CModelException, IOException {
IPath path = new Path("resources/elf/outside_hints/be64lib");
IBinaryFile binary = elfParser.getBinary(readHints(path), path);
assertTrue("Binary should be a library", binary instanceof ElfBinaryShared);
}
}

View file

@ -0,0 +1,28 @@
all: be32 be32lib be64 be64lib le32 le32lib le64 le64lib
be32: be32.asm
nasm be32.asm
be32lib: be32lib.asm
nasm be32lib.asm
be64: be64.asm
nasm be64.asm
be64lib: be64lib.asm
nasm be64lib.asm
le32: le32.asm
nasm le32.asm
le32lib: le32lib.asm
nasm le32lib.asm
le64: le64.asm
nasm le64.asm
le64lib: le64lib.asm
nasm le64lib.asm
clean:
rm -f be32 be32lib be64 be64lib le32 le32lib le64 le64lib

View file

@ -0,0 +1,68 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x0300; e_machine x86
dd 0x01000000; e_version
dd 0xC8000000; e_entry
dd 0x34000000; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x3400; e_ehsize
dw 0x2000; e_phentsize
dw 0x0400; e_phnum
dw 0x2800; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x06000000; p_type: PT_PHDR
dd 0x34000000; p_offset
dd 0x34000000; p_vaddr
dd 0x34000000; p_paddr
dd 0x60000000; p_filesz
dd 0x60000000; p_memsz
dd 0x04000000; p_flags, 32 bit
dd 0x04000000; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
; Program Header 3
dd 0x03000000; p_type: PT_INTERP
dd 0xB4000000; p_offset
dd 0xB4000000; p_vaddr
dd 0xB4000000; p_paddr
dd 0x13000000; p_filesz
dd 0x13000000; p_memsz
dd 0x04000000; p_flags, 32 bit
dd 0x01000000; p_align
; Program Header 4
dd 0x01000000; p_type: PT_LOAD
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0xB4000000; p_filesz
dd 0xB4000000; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00010000; p_align
db '/', 'l', 'i', 'b', '/', 'l', 'd', '-'
db 'l', 'i', 'n', 'u', 'x', '.', 's', 'o'
db '.', '2', 0x00
db 0x00; pad

View file

@ -0,0 +1,35 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x0300; e_machine x86
dd 0x01000000; e_version
dd 0x58000000; e_entry
dd 0x34000000; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x3400; e_ehsize
dw 0x2000; e_phentsize
dw 0x0100; e_phnum
dw 0x2800; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
dd 0x03000000; random value

View file

@ -0,0 +1,60 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x3E00; e_machine x86-64
dd 0x01000000; e_version
dq 0x1001000000000000; e_entry
dq 0x4000000000000000; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x4000; e_ehsize
dw 0x3800; e_phentsize
dw 0x0300; e_phnum
dw 0x4000; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x06000000; p_type: PT_PHDR
dd 0x04000000; p_flags, x86-64 only
dq 0x4000000000000000; p_offset
dq 0x4000000000000000; p_vaddr
dq 0x4000000000000000; p_paddr
dq 0xB000000000000000; p_filesz
dq 0xB000000000000000; p_memsz
dq 0x0800000000000000; p_align
; Program Header 2
dd 0x03000000; p_type: PT_INTERP
dd 0x04000000; p_flags, x86-64 only
dq 0xE800000000000000; p_offset
dq 0xE800000000000000; p_vaddr
dq 0xE800000000000000; p_paddr
dq 0x1C00000000000000; p_filesz
dq 0x1C00000000000000; p_memsz
dq 0x0100000000000000; p_align
; Program Header 3
dd 0x01000000; p_type: PT_LOAD
dd 0x04000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0xF000000000000000; p_filesz
dq 0xF000000000000000; p_memsz
dq 0x0001000000000000; p_align
db '/', 'l', 'i', 'b', '6', '4', '/', 'l'
db 'd', '-', 'l', 'i', 'n', 'u', 'x', '-'
db 'x', '8', '6', '-', '6', '4', '.', 's'
db 'o', '.', '2', 0x00
dd 0x00; pad
dq 0x00; pad

View file

@ -0,0 +1,36 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x3E00; e_machine x86-64
dd 0x01000000; e_version
dq 0x8000000000000000; e_entry
dq 0x4000000000000000; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x4000; e_ehsize
dw 0x3800; e_phentsize
dw 0x0100; e_phnum
dw 0x4000; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
dd 0x03000000; random value
dd 0x00000000; pad;

View file

@ -0,0 +1,68 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x0003; e_machine x86
dd 0x00000001; e_version
dd 0x000000C8; e_entry
dd 0x00000034; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x0034; e_ehsize
dw 0x0020; e_phentsize
dw 0x0004; e_phnum
dw 0x0028; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000006; p_type: PT_PHDR
dd 0x00000034; p_offset
dd 0x00000034; p_vaddr
dd 0x00000034; p_paddr
dd 0x00000060; p_filesz
dd 0x00000060; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000004; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
; Program Header 3
dd 0x00000003; p_type: PT_INTERP
dd 0x000000B4; p_offset
dd 0x000000B4; p_vaddr
dd 0x000000B4; p_paddr
dd 0x00000013; p_filesz
dd 0x00000013; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000001; p_align
; Program Header 4
dd 0x00000001; p_type: PT_LOAD
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x000000B4; p_filesz
dd 0x000000B4; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000100; p_align
db '/', 'l', 'i', 'b', '/', 'l', 'd', '-'
db 'l', 'i', 'n', 'u', 'x', '.', 's', 'o'
db '.', '2', 0x00
db 0x00; pad

View file

@ -0,0 +1,35 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x0003; e_machine x86
dd 0x00000001; e_version
dd 0x00000058; e_entry
dd 0x00000034; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x0034; e_ehsize
dw 0x0020; e_phentsize
dw 0x0001; e_phnum
dw 0x0028; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
dd 0x00000003; random value

View file

@ -0,0 +1,60 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x003E; e_machine x86-64
dd 0x00000001; e_version
dq 0x0000000000000110; e_entry
dq 0x0000000000000040; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x0040; e_ehsize
dw 0x0038; e_phentsize
dw 0x0003; e_phnum
dw 0x0040; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000006; p_type: PT_PHDR
dd 0x00000004; p_flags, x86-64 only
dq 0x0000000000000040; p_offset
dq 0x0000000000000040; p_vaddr
dq 0x0000000000000040; p_paddr
dq 0x00000000000000B0; p_filesz
dq 0x00000000000000B0; p_memsz
dq 0x0000000000000008; p_align
; Program Header 2
dd 0x00000003; p_type: PT_INTERP
dd 0x00000004; p_flags, x86-64 only
dq 0x00000000000000E8; p_offset
dq 0x00000000000000E8; p_vaddr
dq 0x00000000000000E8; p_paddr
dq 0x000000000000001C; p_filesz
dq 0x000000000000001C; p_memsz
dq 0x0000000000000001; p_align
; Program Header 3
dd 0x00000001; p_type: PT_LOAD
dd 0x00000004; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x00000000000000F0; p_filesz
dq 0x00000000000000F0; p_memsz
dq 0x0000000000000100; p_align
db '/', 'l', 'i', 'b', '6', '4', '/', 'l'
db 'd', '-', 'l', 'i', 'n', 'u', 'x', '-'
db 'x', '8', '6', '-', '6', '4', '.', 's'
db 'o', '.', '2', 0x00
dd 0x00; pad
dq 0x00; pad

View file

@ -0,0 +1,36 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x003E; e_machine x86-64
dd 0x00000001; e_version
dq 0x0000000000000080; e_entry
dq 0x0000000000000040; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x0040; e_ehsize
dw 0x0038; e_phentsize
dw 0x0001; e_phnum
dw 0x0040; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
dd 0x00000003; random value
dd 0x00000000; pad

View file

@ -0,0 +1,28 @@
all: be32 be32lib be64 be64lib le32 le32lib le64 le64lib
be32: be32.asm
nasm be32.asm
be32lib: be32lib.asm
nasm be32lib.asm
be64: be64.asm
nasm be64.asm
be64lib: be64lib.asm
nasm be64lib.asm
le32: le32.asm
nasm le32.asm
le32lib: le32lib.asm
nasm le32lib.asm
le64: le64.asm
nasm le64.asm
le64lib: le64lib.asm
nasm le64lib.asm
clean:
rm -f be32 be32lib be64 be64lib le32 le32lib le64 le64lib

View file

@ -0,0 +1,68 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x0300; e_machine x86
dd 0x01000000; e_version
dd 0xC8000000; e_entry
dd 0x34000000; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x3400; e_ehsize
dw 0x2000; e_phentsize
dw 0x0400; e_phnum
dw 0x2800; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x06000000; p_type: PT_PHDR
dd 0x34000000; p_offset
dd 0x34000000; p_vaddr
dd 0x34000000; p_paddr
dd 0x60000000; p_filesz
dd 0x60000000; p_memsz
dd 0x04000000; p_flags, 32 bit
dd 0x04000000; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
; Program Header 3
dd 0x01000000; p_type: PT_LOAD
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0xB4000000; p_filesz
dd 0xB4000000; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00010000; p_align
; Program Header 4
dd 0x03000000; p_type: PT_INTERP
dd 0xB4000000; p_offset
dd 0xB4000000; p_vaddr
dd 0xB4000000; p_paddr
dd 0x13000000; p_filesz
dd 0x13000000; p_memsz
dd 0x04000000; p_flags, 32 bit
dd 0x01000000; p_align
db '/', 'l', 'i', 'b', '/', 'l', 'd', '-'
db 'l', 'i', 'n', 'u', 'x', '.', 's', 'o'
db '.', '2', 0x00
db 0x00; pad

View file

@ -0,0 +1,65 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x0300; e_machine x86
dd 0x01000000; e_version
dd 0xB8000000; e_entry
dd 0x34000000; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x3400; e_ehsize
dw 0x2000; e_phentsize
dw 0x0400; e_phnum
dw 0x2800; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x06000000; p_type: PT_PHDR
dd 0x34000000; p_offset
dd 0x34000000; p_vaddr
dd 0x34000000; p_paddr
dd 0x60000000; p_filesz
dd 0x60000000; p_memsz
dd 0x04000000; p_flags, 32 bit
dd 0x04000000; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
; Program Header 3
dd 0x01000000; p_type: PT_LOAD
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0xB4000000; p_filesz
dd 0xB4000000; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00010000; p_align
; Program Header 4
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
dd 0x03000000; random value

View file

@ -0,0 +1,60 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x3E00; e_machine x86-64
dd 0x01000000; e_version
dq 0x1001000000000000; e_entry
dq 0x4000000000000000; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x4000; e_ehsize
dw 0x3800; e_phentsize
dw 0x0300; e_phnum
dw 0x4000; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x06000000; p_type: PT_PHDR
dd 0x04000000; p_flags, x86-64 only
dq 0x4000000000000000; p_offset
dq 0x4000000000000000; p_vaddr
dq 0x4000000000000000; p_paddr
dq 0xB000000000000000; p_filesz
dq 0xB000000000000000; p_memsz
dq 0x0800000000000000; p_align
; Program Header 2
dd 0x01000000; p_type: PT_LOAD
dd 0x04000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0xF000000000000000; p_filesz
dq 0xF000000000000000; p_memsz
dq 0x0001000000000000; p_align
; Program Header 3
dd 0x03000000; p_type: PT_INTERP
dd 0x04000000; p_flags, x86-64 only
dq 0xE800000000000000; p_offset
dq 0xE800000000000000; p_vaddr
dq 0xE800000000000000; p_paddr
dq 0x1C00000000000000; p_filesz
dq 0x1C00000000000000; p_memsz
dq 0x0100000000000000; p_align
db '/', 'l', 'i', 'b', '6', '4', '/', 'l'
db 'd', '-', 'l', 'i', 'n', 'u', 'x', '-'
db 'x', '8', '6', '-', '6', '4', '.', 's'
db 'o', '.', '2', 0x00
dd 0x00; pad
dq 0x00; pad

View file

@ -0,0 +1,56 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x02; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0300; e_type: ET_DYN
dw 0x3E00; e_machine x86-64
dd 0x01000000; e_version
dq 0x1001000000000000; e_entry
dq 0x4000000000000000; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x4000; e_ehsize
dw 0x3800; e_phentsize
dw 0x0300; e_phnum
dw 0x4000; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
; Program Header 3
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
dd 0x03000000; random value
dd 0x00000000; pad

View file

@ -0,0 +1,68 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x0003; e_machine x86
dd 0x00000001; e_version
dd 0x000000C8; e_entry
dd 0x00000034; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x0034; e_ehsize
dw 0x0020; e_phentsize
dw 0x0004; e_phnum
dw 0x0028; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000006; p_type: PT_PHDR
dd 0x00000034; p_offset
dd 0x00000034; p_vaddr
dd 0x00000034; p_paddr
dd 0x00000060; p_filesz
dd 0x00000060; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000004; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
; Program Header 3
dd 0x00000001; p_type: PT_LOAD
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x000000B4; p_filesz
dd 0x000000B4; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000100; p_align
; Program Header 4
dd 0x00000003; p_type: PT_INTERP
dd 0x000000B4; p_offset
dd 0x000000B4; p_vaddr
dd 0x000000B4; p_paddr
dd 0x00000013; p_filesz
dd 0x00000013; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000001; p_align
db '/', 'l', 'i', 'b', '/', 'l', 'd', '-'
db 'l', 'i', 'n', 'u', 'x', '.', 's', 'o'
db '.', '2', 0x00
db 0x00; pad

View file

@ -0,0 +1,65 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x01; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x0003; e_machine x86
dd 0x00000001; e_version
dd 0x000000B8; e_entry
dd 0x00000034; e_phoff
dd 0x00000000; e_shoff
dd 0x00000000; e_flags
dw 0x0034; e_ehsize
dw 0x0020; e_phentsize
dw 0x0004; e_phnum
dw 0x0028; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000006; p_type: PT_PHDR
dd 0x00000034; p_offset
dd 0x00000034; p_vaddr
dd 0x00000034; p_paddr
dd 0x00000060; p_filesz
dd 0x00000060; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000004; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
; Program Header 3
dd 0x00000001; p_type: PT_LOAD
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x000000B4; p_filesz
dd 0x000000B4; p_memsz
dd 0x00000004; p_flags, 32 bit
dd 0x00000100; p_align
; Program Header 4
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_offset
dd 0x00000000; p_vaddr
dd 0x00000000; p_paddr
dd 0x00000000; p_filesz
dd 0x00000000; p_memsz
dd 0x00000000; p_flags, 32 bit
dd 0x00000000; p_align
dd 0x00000003; random value

View file

@ -0,0 +1,60 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x003E; e_machine x86-64
dd 0x00000001; e_version
dq 0x0000000000000110; e_entry
dq 0x0000000000000040; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x0040; e_ehsize
dw 0x0038; e_phentsize
dw 0x0003; e_phnum
dw 0x0040; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000006; p_type: PT_PHDR
dd 0x00000004; p_flags, x86-64 only
dq 0x0000000000000040; p_offset
dq 0x0000000000000040; p_vaddr
dq 0x0000000000000040; p_paddr
dq 0x00000000000000B0; p_filesz
dq 0x00000000000000B0; p_memsz
dq 0x0000000000000008; p_align
; Program Header 2
dd 0x00000001; p_type: PT_LOAD
dd 0x00000004; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x00000000000000F0; p_filesz
dq 0x00000000000000F0; p_memsz
dq 0x0000000000000100; p_align
; Program Header 3
dd 0x00000003; p_type: PT_INTERP
dd 0x00000004; p_flags, x86-64 only
dq 0x00000000000000E8; p_offset
dq 0x00000000000000E8; p_vaddr
dq 0x00000000000000E8; p_paddr
dq 0x000000000000001C; p_filesz
dq 0x000000000000001C; p_memsz
dq 0x0000000000000001; p_align
db '/', 'l', 'i', 'b', '6', '4', '/', 'l'
db 'd', '-', 'l', 'i', 'n', 'u', 'x', '-'
db 'x', '8', '6', '-', '6', '4', '.', 's'
db 'o', '.', '2', 0x00
dd 0x00; pad
dq 0x00; pad

View file

@ -0,0 +1,56 @@
; ELF Header
db 0x7F, 'E', 'L', 'F'; Magic start
db 0x02; EI_CLASS: 1: 32 bit, 2: 64 bit
db 0x01; EI_DATA: 1: LE, 2: BE
db 0x01; EI_VERSION: 1: Original ELF
db 0x00; EI_OSABI: 00: System-V, 03: Linux, mostly 0x00 regardless
db 0x00; EI_ABIVERSION: mostly unused therefore 0x00
db 0x00; EI_PAD
dw 0x0000; EI_PAD
dd 0x00000000; EI_PAD
dw 0x0003; e_type: ET_DYN
dw 0x003E; e_machine x86-64
dd 0x00000001; e_version
dq 0x0000000000000110; e_entry
dq 0x0000000000000040; e_phoff
dq 0x0000000000000000; e_shoff
dd 0x00000000; e_flags
dw 0x0040; e_ehsize
dw 0x0038; e_phentsize
dw 0x0003; e_phnum
dw 0x0040; e_shentsize
dw 0x0000; e_shnum
dw 0x0000; e_shstrndx
; Program Header 1
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
; Program Header 2
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
; Program Header 3
dd 0x00000000; p_type: PT_NULL
dd 0x00000000; p_flags, x86-64 only
dq 0x0000000000000000; p_offset
dq 0x0000000000000000; p_vaddr
dq 0x0000000000000000; p_paddr
dq 0x0000000000000000; p_filesz
dq 0x0000000000000000; p_memsz
dq 0x0000000000000000; p_align
dd 0x00000003; random value
dd 0x00000000; pad

View file

@ -38,6 +38,7 @@ import org.eclipse.cdt.utils.FindProgramLocationTest;
import org.eclipse.cdt.utils.StorableCdtVariablesTest;
import org.eclipse.cdt.utils.UNCPathConverterTest;
import org.eclipse.cdt.utils.WeakHashSetTest;
import org.eclipse.cdt.utils.elf.ElfParserTest;
import junit.framework.Test;
import junit.framework.TestCase;
@ -92,6 +93,7 @@ public class AutomatedIntegrationSuite extends TestSuite {
suite.addTest(ByteUtilsTest.suite());
suite.addTest(UNCPathConverterTest.suite());
suite.addTest(TestScopeOfBuildConfigResourceChangesPreference.suite());
suite.addTest(ElfParserTest.suite());
// Add in PDOM tests
suite.addTest(PDOMTests.suite());

View file

@ -23,6 +23,7 @@ import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@ -32,7 +33,6 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IBinaryParser;
import org.eclipse.cdt.core.IConsoleParser;
import org.eclipse.cdt.core.IConsoleParser2;
import org.eclipse.cdt.core.IMarkerGenerator;
@ -62,9 +62,6 @@ import org.eclipse.cdt.internal.core.build.Messages;
import org.eclipse.cdt.internal.core.model.BinaryRunner;
import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.core.parser.ParserSettings2;
import org.eclipse.cdt.utils.elf.Elf;
import org.eclipse.cdt.utils.elf.Elf.PHdr;
import org.eclipse.cdt.utils.elf.parser.ElfBinaryShared;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IBuildConfiguration;
import org.eclipse.core.resources.IContainer;
@ -260,46 +257,22 @@ public abstract class CBuildConfiguration extends PlatformObject
ICProject cproject = CoreModel.getDefault().create(config.getProject());
IBinaryContainer binaries = cproject.getBinaryContainer();
IPath outputPath = getBuildContainer().getFullPath();
List<IBinary> outputs = new ArrayList<>();
for (IBinary binary : binaries.getBinaries()) {
if (outputPath.isPrefixOf(binary.getPath())) {
if (binary.isExecutable()) {
outputs.add(binary);
} else if (binary.isSharedLib()) {
// Special case of PIE executable that looks like shared
// library
IBinaryParser.IBinaryObject bin = binary.getAdapter(IBinaryParser.IBinaryObject.class);
if (bin instanceof ElfBinaryShared) {
try {
Elf elf = new Elf(bin.getPath().toOSString());
for (PHdr phdr : elf.getPHdrs()) {
if (phdr.p_type == PHdr.PT_INTERP) {
outputs.add(binary);
break;
}
}
} catch (IOException e) {
CCorePlugin.log(e);
}
}
}
}
final IBinary[] outputs = getBuildOutput(binaries, outputPath);
if (outputs.length > 0) {
return outputs;
}
if (outputs.isEmpty()) {
// Give the binary runner a kick and try again.
BinaryRunner runner = CModelManager.getDefault().getBinaryRunner(cproject);
runner.start();
runner.waitIfRunning();
for (IBinary binary : binaries.getBinaries()) {
if (binary.isExecutable() && outputPath.isPrefixOf(binary.getPath())) {
outputs.add(binary);
}
}
}
// Give the binary runner a kick and try again.
BinaryRunner runner = CModelManager.getDefault().getBinaryRunner(cproject);
runner.start();
runner.waitIfRunning();
return getBuildOutput(binaries, outputPath);
}
return outputs.toArray(new IBinary[outputs.size()]);
private IBinary[] getBuildOutput(final IBinaryContainer binaries, final IPath outputPath) throws CoreException {
return Arrays.stream(binaries.getBinaries())
.filter(b -> b.isExecutable() && outputPath.isPrefixOf(b.getPath()))
.toArray(IBinary[]::new);
}
public void setActive(IProgressMonitor monitor) throws CoreException {

View file

@ -959,10 +959,8 @@ public class Elf {
}
public static boolean isElfHeader(byte[] e_ident) {
if (e_ident.length < 4 || e_ident[ELFhdr.EI_MAG0] != 0x7f || e_ident[ELFhdr.EI_MAG1] != 'E'
|| e_ident[ELFhdr.EI_MAG2] != 'L' || e_ident[ELFhdr.EI_MAG3] != 'F')
return false;
return true;
return e_ident != null && e_ident.length >= 4 && e_ident[ELFhdr.EI_MAG0] == 0x7f
&& e_ident[ELFhdr.EI_MAG1] == 'E' && e_ident[ELFhdr.EI_MAG2] == 'L' && e_ident[ELFhdr.EI_MAG3] == 'F';
}
public void dispose() {

View file

@ -8,11 +8,16 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
* Hansruedi Patzen (IFS)
*******************************************************************************/
package org.eclipse.cdt.utils.elf.parser;
import static org.eclipse.cdt.internal.core.ByteUtils.makeShort;
import static org.eclipse.cdt.internal.core.ByteUtils.makeInt;
import java.io.EOFException;
import java.io.IOException;
import java.util.Arrays;
import org.eclipse.cdt.core.AbstractCExtension;
import org.eclipse.cdt.core.CCorePlugin;
@ -20,7 +25,10 @@ import org.eclipse.cdt.core.IBinaryParser;
import org.eclipse.cdt.utils.AR;
import org.eclipse.cdt.utils.elf.Elf;
import org.eclipse.cdt.utils.elf.Elf.Attribute;
import org.eclipse.cdt.utils.elf.Elf.ELFhdr;
import org.eclipse.cdt.utils.elf.Elf.PHdr;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
/**
*/
@ -46,19 +54,7 @@ public class ElfParser extends AbstractCExtension implements IBinaryParser {
binary = createBinaryArchive(path);
} else {
try {
Elf.Attribute attribute = null;
if (hints != null && Elf.isElfHeader(hints)) {
try {
attribute = Elf.getAttributes(hints);
} catch (EOFException eof) {
// continue, the array was to small.
}
}
//Take a second run at it if the data array failed.
if(attribute == null) {
attribute = Elf.getAttributes(path.toOSString());
}
Attribute attribute = getAttribute(hints, path);
if (attribute != null) {
switch (attribute.getType()) {
@ -67,7 +63,7 @@ public class ElfParser extends AbstractCExtension implements IBinaryParser {
break;
case Attribute.ELF_TYPE_SHLIB :
binary = createBinaryShared(path);
binary = hasInterpProgramHeader(hints, path) ? createBinaryExecutable(path) : createBinaryShared(path);
break;
case Attribute.ELF_TYPE_OBJ :
@ -139,4 +135,62 @@ public class ElfParser extends AbstractCExtension implements IBinaryParser {
protected IBinaryObject createBinaryCore(IPath path) throws IOException {
return new ElfBinaryObject(this, path, IBinaryFile.CORE);
}
private static Elf.Attribute getAttribute(byte[] hints, IPath path) throws IOException {
if (Elf.isElfHeader(hints)) {
try {
return Elf.getAttributes(hints);
} catch (EOFException eof) {
// continue, the array was to small.
}
}
return Elf.getAttributes(path.toOSString());
}
private static boolean hasInterpProgramHeader(byte[] hints, IPath path) throws IOException {
if (Elf.isElfHeader(hints)) {
int e_phentsizeOffset = 0;
int e_phnumOffset = 0;
int e_ehsizeOffset = 0;
switch (hints[ELFhdr.EI_CLASS]) {
case ELFhdr.ELFCLASS32:
e_ehsizeOffset = 0x28;
e_phentsizeOffset = 0x2A;
e_phnumOffset = 0x2C;
break;
case ELFhdr.ELFCLASS64:
e_ehsizeOffset = 0x34;
e_phentsizeOffset = 0x36;
e_phnumOffset = 0x38;
break;
default:
CCorePlugin.log(IStatus.WARNING, "Unknown ELF header class in file: " + path.toOSString()); //$NON-NLS-1$
return false;
}
if (e_phnumOffset + 2 < hints.length) {
boolean isle = (hints[ELFhdr.EI_DATA] == ELFhdr.ELFDATA2LSB);
short e_phentsize = makeShort(hints, e_phentsizeOffset, isle);
short e_phnum = makeShort(hints, e_phnumOffset, isle);
short e_ehsize = makeShort(hints, e_ehsizeOffset, isle);
int lastProgramHeaderOffset = e_ehsize + (e_phnum - 1) * e_phentsize;
for (int i = e_ehsize; i < Math.min(lastProgramHeaderOffset, hints.length) + 4; i += e_phentsize) {
if (makeInt(hints, i, isle) == PHdr.PT_INTERP) {
return true;
}
}
/* See if we checked every program header type */
if (lastProgramHeaderOffset + 4 < hints.length) {
return false;
}
}
}
try {
/* No PHdr.PT_INTERP found in the hints meaning we need to read the file itself */
return Arrays.stream(new Elf(path.toOSString()).getPHdrs()).anyMatch(phdr -> phdr.p_type == PHdr.PT_INTERP);
} catch (IOException e) {
CCorePlugin.log(e);
}
return false;
}
}