1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-25 01:45:33 +02:00

Framework for the IBinaryParser for Elf.

This commit is contained in:
Alain Magloire 2002-11-18 15:43:53 +00:00
parent 8e7d223aa9
commit afe548ff84
5 changed files with 1039 additions and 0 deletions

View file

@ -0,0 +1,265 @@
package org.eclipse.cdt.internal.core.model.parser;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.ArrayList;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryArchive;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.internal.core.model.Container;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.QualifiedName;
/**
*/
public class BinaryContainerAdapter extends Container implements IFolder {
IBinaryArchive archive;
long timestamp;
ArrayList children;
ArrayList phantomResources;
public BinaryContainerAdapter (IBinaryArchive ar) {
archive = ar;
phantomResources = new ArrayList(0);
children = new ArrayList(5);
}
/**
* @see org.eclipse.core.resources.IResource#refreshLocal(int, IProgressMonitor)
*/
public void refreshLocal(int depth, IProgressMonitor monitor) throws CoreException {
IFile file = archive.getFile();
if (file != null) {
file.refreshLocal(depth, monitor);
}
}
/**
* @see org.eclipse.core.resources.IResource#getFullPath()
*/
public IPath getFullPath() {
IFile file = archive.getFile();
if (file != null) {
return file.getFullPath();
}
return new Path("");
}
/**
* @see org.eclipse.core.resources.IResource#getParent()
*/
public IContainer getParent() {
IFile file = archive.getFile();
if (file != null) {
return file.getParent();
}
return null;
}
/**
* @see org.eclipse.core.resources.IResource#getType()
*/
public int getType() {
return IResource.FOLDER;
}
/**
* @see org.eclipse.core.resources.IResource#getModificationStamp()
*/
public long getModificationStamp() {
IFile file = archive.getFile();
if (file != null) {
return file.getModificationStamp();
}
return 0;
}
/**
* @see org.eclipse.core.resources.IFolder#delete(boolean, boolean, IProgressMonitor)
*/
public void delete(boolean force, boolean keepHistory,
IProgressMonitor monitor) throws CoreException {
delete((keepHistory ? KEEP_HISTORY : IResource.NONE) | (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IResource#delete(int, IProgressMonitor)
*/
public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException {
IFile file = archive.getFile();
if (file != null) {
file.delete(updateFlags, monitor);
}
}
/**
* @see org.eclipse.core.resources.IResource#touch(IProgressMonitor)
*/
public void touch(IProgressMonitor monitor) throws CoreException {
IFile file = archive.getFile();
if (file != null) {
file.touch(monitor);
}
}
/**
* @see org.eclipse.core.resources.IFolder#create(boolean, boolean, IProgressMonitor)
*/
public void create(boolean force, boolean local, IProgressMonitor monitor)
throws CoreException {
create((force ? FORCE : IResource.NONE), local, monitor);
}
/**
* @see org.eclipse.core.resources.IFolder#create(int, boolean, IProgressMonitor)
*/
public void create(int updateFlags, boolean local,
IProgressMonitor monitor) throws CoreException {
// FIXME: Not implemented.
}
/**
* @see org.eclipse.core.resources.IFolder#getFile(String)
*/
public IFile getFile(IPath path) {
IFile f = (IFile)findMember(path);
if (f == null) {
// Pass it to parent to create a fake/phantom if the object
// is not in the archive.
f = getParent().getFile(path);
// Add it to the list of phantoms
if (! phantomResources.contains(f)) {
phantomResources.add(f);
phantomResources.trimToSize();
}
}
return f;
}
/**
* @see org.eclipse.core.resources.IFolder#move(IPath, boolean, boolean, IProgressMonitor)
*/
public void move(IPath destination, boolean force, boolean keepHistory,
IProgressMonitor monitor) throws CoreException {
move(destination, (keepHistory ? KEEP_HISTORY : IResource.NONE) | (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IContainer#exists(IPath)
*/
public boolean exists(IPath path) {
// Check if it is the archive.
if (getFullPath().equals(path)) {
IFile file = archive.getFile();
if (file != null) {
return file.exists();
}
return false;
}
return findMember(path) != null;
}
/**
* @see org.eclipse.core.resources.IContainer#getFolder(IPath)
*/
public IFolder getFolder(IPath path) {
// Only Files in the archive pass this to the parent
// to create a phatom resource
IFolder f = getParent().getFolder(path);
if (!phantomResources.contains(f)) {
phantomResources.add(f);
phantomResources.trimToSize();
}
return f;
}
/**
* @see org.eclipse.core.resources.IContainer#members(int)
*/
public IResource[] members(int memberFlags) throws CoreException {
final boolean includePhantoms = (memberFlags & IContainer.INCLUDE_PHANTOMS) != 0;
final boolean includeTeamPrivateMember =
(memberFlags & IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS) != 0;
ArrayList aList = new ArrayList();
if (hasChanged()) {
children.clear();
IBinaryObject[] objects = archive.getObjects();
for (int i = 0; i < objects.length; i++) {
children.add(new BinaryFileAdapter(this, objects[i]));
}
}
for (int i = 0; i < children.size(); i++) {
IResource child = (IResource)children.get(i);
if (includeTeamPrivateMember && child.isTeamPrivateMember() || !child.isTeamPrivateMember()) {
aList.add(child);
}
}
if (includePhantoms) {
aList.addAll(phantomResources);
}
return (IResource[])aList.toArray(new IResource[0]);
}
/**
* @see org.eclipse.core.resources.IContainer#findDeletedMembersWithHistory(int, IProgressMonitor)
*/
public IFile[] findDeletedMembersWithHistory(int depth, IProgressMonitor monitor)
throws CoreException {
return new IFile[0];
}
/**
* @see org.eclipse.core.resources.IResource#getPersistentProperty(QualifiedName)
*/
public String getPersistentProperty(QualifiedName key) throws CoreException {
IFile file = archive.getFile();
if (file != null) {
return file.getPersistentProperty(key);
}
return null;
}
/**
* @see org.eclipse.core.resources.IResource#setPersistentProperty(QualifiedName, String)
*/
public void setPersistentProperty(QualifiedName key, String value) throws CoreException {
IFile file = archive.getFile();
if (file != null) {
file.setPersistentProperty(key, value);
}
}
/**
* @see org.eclipse.core.resources.IResource#exists()
*/
public boolean exists() {
IFile file = archive.getFile();
if (file != null) {
return file.exists();
}
return false;
}
boolean hasChanged() {
boolean changed;
long modif = getModificationStamp();
changed = modif != timestamp;
timestamp = modif;
return changed;
}
}

View file

@ -0,0 +1,231 @@
package org.eclipse.cdt.internal.core.model.parser;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.io.InputStream;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.internal.core.model.Resource;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFileState;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.QualifiedName;
/**
*/
public class BinaryFileAdapter extends Resource implements IFile {
IBinaryObject object;
IContainer parent;
public BinaryFileAdapter(IContainer p, IBinaryObject o) {
object = o;
parent = p;
}
/**
* @see org.eclipse.core.resources.IFile#appendContents(InputStream, boolean, boolean, IProgressMonitor)
*/
public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
appendContents(source, (keepHistory ? KEEP_HISTORY : IResource.NONE) | (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IFile#appendContents(InputStream, int, IProgressMonitor)
*/
public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor)
throws CoreException {
// FIXME: Not implemented.
}
/**
* @see org.eclipse.core.resources.IFile#create(InputStream, boolean, IProgressMonitor)
*/
public void create(InputStream source, boolean force,
IProgressMonitor monitor) throws CoreException {
create(source, (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IFile#create(InputStream, int, IProgressMonitor)
*/
public void create(InputStream source, int updateFlags,
IProgressMonitor monitor) throws CoreException {
// FIXME: Not implemented.
}
/**
* @see org.eclipse.core.resources.IStorage#getContents()
*/
public InputStream getContents() throws CoreException {
return getContents(false);
}
/**
* @see org.eclipse.core.resources.IFile#getContents(boolean)
*/
public InputStream getContents(boolean force) throws CoreException {
return object.getContents();
}
/**
* @see org.eclipse.core.resources.IFile#getEncoding()
*/
public int getEncoding() throws CoreException {
return ENCODING_UNKNOWN;
}
/**
* @see org.eclipse.core.resources.IFile#getHistory(IProgressMonitor)
*/
public IFileState[] getHistory(IProgressMonitor monitor)
throws CoreException {
return new IFileState[0];
}
/**
* @see org.eclipse.core.resources.IFile#move(IPath, boolean, boolean, IProgressMonitor)
*/
public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor)
throws CoreException {
move(destination, (keepHistory ? KEEP_HISTORY : IResource.NONE)
| (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IFile#setContents(InputStream, boolean, boolean, IProgressMonitor)
*/
public void setContents(InputStream source, boolean force, boolean keepHistory,
IProgressMonitor monitor) throws CoreException {
setContents(source, (keepHistory ? KEEP_HISTORY : IResource.NONE)
| (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IFile#setContents(IFileState, boolean, boolean, IProgressMonitor)
*/
public void setContents(IFileState source, boolean force, boolean keepHistory,
IProgressMonitor monitor) throws CoreException {
setContents(source, (keepHistory ? KEEP_HISTORY : IResource.NONE)
| (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IFile#setContents(InputStream, int, IProgressMonitor)
*/
public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor)
throws CoreException {
// FIXME: Not implemented.
}
/**
* @see org.eclipse.core.resources.IFile#setContents(IFileState, int, IProgressMonitor)
*/
public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor)
throws CoreException {
// FIXME: Not implemented.
}
/**
* @see org.eclipse.core.resources.IFile#delete(boolean, boolean, IProgressMonitor)
*/
public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor)
throws CoreException {
delete((keepHistory ? KEEP_HISTORY : IResource.NONE)
| (force ? FORCE : IResource.NONE), monitor);
}
/**
* @see org.eclipse.core.resources.IResource#delete(int, IProgressMonitor)
*/
public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException {
// FIXME: Not implemented.
}
/**
* @see org.eclipse.core.resources.IResource#getFullPath()
*/
public IPath getFullPath() {
IFile file = object.getFile();
if (file != null) {
return file.getFullPath().append(object.getName());
}
return new Path(object.getName());
}
/**
* @see org.eclipse.core.resources.IResource#getModificationStamp()
*/
public long getModificationStamp() {
IFile file = object.getFile();
if (file != null) {
return file.getModificationStamp();
}
return 0;
}
/**
* @see org.eclipse.core.resources.IResource#getParent()
*/
public IContainer getParent() {
return parent;
}
/**
* @see org.eclipse.core.resources.IResource#getType()
*/
public int getType() {
return IResource.FILE;
}
/**
* @see org.eclipse.core.resources.IResource#refreshLocal(int, IProgressMonitor)
*/
public void refreshLocal(int depth, IProgressMonitor monitor) throws CoreException {
IFile file = object.getFile();
if (file != null) {
file.refreshLocal(depth, monitor);
}
}
/**
* @see org.eclipse.core.resources.IResource#touch(IProgressMonitor)
*/
public void touch(IProgressMonitor monitor) throws CoreException {
IFile file = object.getFile();
if (file != null) {
file.touch(monitor);
}
}
/**
* @see org.eclipse.core.resources.IResource#getPersistentProperty(QualifiedName)
*/
public String getPersistentProperty(QualifiedName key)
throws CoreException {
return null;
}
/**
* @see org.eclipse.core.resources.IResource#setPersistentProperty(QualifiedName, String)
*/
public void setPersistentProperty(QualifiedName key, String value)
throws CoreException {
}
/**
* @see org.eclipse.core.resources.IResource#exists()
*/
public boolean exists() {
return parent.exists(new Path(getName()));
}
}

View file

@ -0,0 +1,94 @@
package org.eclipse.cdt.internal.core.model.parser;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryArchive;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.utils.elf.AR;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.PlatformObject;
/**
*/
public class ElfBinaryArchive extends PlatformObject implements IBinaryArchive {
IFile file;
ArrayList children;
long timestamp;
public ElfBinaryArchive(IFile f) {
file = f;
children = new ArrayList(5);
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryArchive#getObjects()
*/
public IBinaryObject[] getObjects() {
if (hasChanged()) {
children.clear();
IPath location = file.getLocation();
if (location != null) {
AR ar = null;
try {
ar = new AR(location.toOSString());
AR.ARHeader[] headers = ar.getHeaders();
for (int i = 0; i < headers.length; i++) {
IBinaryObject bin = new ElfBinaryFile(file, headers[i].getObjectName());
children.add(bin);
}
} catch (IOException e) {
//e.printStackTrace();
}
if (ar != null) {
ar.dispose();
}
}
children.trimToSize();
}
return (IBinaryObject[])children.toArray(new IBinaryObject[0]);
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile#getFile()
*/
public IFile getFile() {
return file;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile#getType()
*/
public int getType() {
return IBinaryFile.ARCHIVE;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile#getContents()
*/
public InputStream getContents() {
try {
return file.getContents();
} catch (CoreException e) {
}
return new ByteArrayInputStream(new byte[0]);
}
boolean hasChanged() {
long modif = file.getModificationStamp();
boolean changed = modif != timestamp;
timestamp = modif;
return changed;
}
}

View file

@ -0,0 +1,414 @@
package org.eclipse.cdt.internal.core.model.parser;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryExecutable;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject;
import org.eclipse.cdt.core.model.IBinaryParser.IBinaryShared;
import org.eclipse.cdt.core.model.IBinaryParser.ISymbol;
import org.eclipse.cdt.utils.elf.AR;
import org.eclipse.cdt.utils.elf.Elf;
import org.eclipse.cdt.utils.elf.ElfHelper;
import org.eclipse.cdt.utils.elf.Elf.Attribute;
import org.eclipse.cdt.utils.elf.ElfHelper.Sizes;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.PlatformObject;
/**
*/
public class ElfBinaryFile extends PlatformObject implements IBinaryFile,
IBinaryObject, IBinaryExecutable, IBinaryShared {
IFile file;
String objectName;
long timestamp;
String soname;
String[] needed;
Sizes sizes;
Attribute attribute;
ArrayList symbols;
public class ElfSymbol implements ISymbol {
String filename;
int lineno;
String name;
int type;
public ElfSymbol (Elf.Symbol symbol, int t) throws IOException {
filename = symbol.getFilename();
name = symbol.toString();
lineno = symbol.getFuncLineNumber();
type = t;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.ISymbol#getFilename()
*/
public String getFilename() {
return filename;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.ISymbol#getLineNumber()
*/
public int getLineNumber() {
return lineno;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.ISymbol#getName()
*/
public String getName() {
return name;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.ISymbol#getType()
*/
public int getType() {
return type;
}
}
public ElfBinaryFile(IFile f) throws IOException {
this(f, null, null);
}
public ElfBinaryFile(IFile f, String n) throws IOException {
this(f, n, null);
}
public ElfBinaryFile(IFile f, String n, Elf elf) throws IOException {
file = f;
objectName = n;
if (elf != null) {
loadAttributes(new ElfHelper(elf));
} else {
loadAttributes();
}
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile#getFile()
*/
public IFile getFile() {
return file;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#getBSS()
*/
public long getBSS() {
Sizes sz = getSizes();
if (sz != null) {
return sizes.bss;
}
return 0;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#getCPU()
*/
public String getCPU() {
Attribute attr = getAttribute();
if (attr != null) {
return attribute.getCPU();
}
return "";
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#getData()
*/
public long getData() {
Sizes sz = getSizes();
if (sz != null) {
return sizes.data;
}
return 0;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#getText()
*/
public long getText() {
Sizes sz = getSizes();
if (sz != null) {
return sizes.text;
}
return 0;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryShared#getSoName()
*/
public String getSoName() {
if (hasChanged()) {
try {
loadInformation();
} catch (IOException e) {
}
}
if (soname != null) {
return soname;
}
return "";
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#hasDebug()
*/
public boolean hasDebug() {
Attribute attr = getAttribute();
if (attr != null) {
return attribute.hasDebug();
}
return false;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#isLittleEndian()
*/
public boolean isLittleEndian() {
Attribute attr = getAttribute();
if (attr != null) {
return attribute.isLittleEndian();
}
return false;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryExecutable#getNeededSharedLibs()
*/
public String[] getNeededSharedLibs() {
if (hasChanged()) {
try {
loadInformation();
} catch (IOException e) {
}
}
if (needed != null) {
return needed;
}
return new String[0];
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile#getType()
*/
public int getType() {
int type = 0;
Attribute attr = getAttribute();
if (attr != null) {
switch (attribute.getType()) {
case Attribute.ELF_TYPE_EXE:
type = IBinaryFile.EXECUTABLE;
break;
case Attribute.ELF_TYPE_SHLIB:
type = IBinaryFile.SHARED;
break;
case Attribute.ELF_TYPE_OBJ:
type = IBinaryFile.OBJECT;
break;
}
}
return type;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#getSymbols()
*/
public ISymbol[] getSymbols() {
if (hasChanged() || symbols == null) {
if (symbols == null) {
symbols = new ArrayList(5);
}
try {
loadInformation();
} catch (IOException e) {
}
}
return (ISymbol[])symbols.toArray(new ISymbol[0]);
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryFile#getContents()
*/
public InputStream getContents() {
InputStream stream = null;
// Archive ?
if (file != null && objectName != null) {
IPath location = file.getLocation();
if (location != null) {
AR ar = null;
try {
ar = new AR(file.getLocation().toOSString());
AR.ARHeader[] headers = ar.getHeaders();
for (int i = 0; i < headers.length; i++) {
if (objectName.equals(headers[i].getObjectName())) {
stream = new ByteArrayInputStream(headers[i].getObjectData());
break;
}
}
} catch (IOException e) {
}
if (ar != null) {
ar.dispose();
}
}
} else if (file != null && file.exists()) {
try {
stream = file.getContents();
} catch (CoreException e) {
}
}
if (stream == null) {
stream = new ByteArrayInputStream(new byte[0]);
}
return stream;
}
/**
* @see org.eclipse.cdt.core.model.IBinaryParser.IBinaryObject#getName()
*/
public String getName() {
return objectName;
}
public String toString() {
return getName();
}
protected Attribute getAttribute() {
if (hasChanged()) {
try {
loadInformation();
} catch (IOException e) {
}
}
return attribute;
}
protected Sizes getSizes() {
if (hasChanged()) {
try {
loadInformation();
} catch (IOException e) {
}
}
return sizes;
}
boolean hasChanged() {
long modification = file.getModificationStamp();
boolean changed = modification != timestamp;
timestamp = modification;
return changed;
}
protected ElfHelper getElfHelper() throws IOException {
// Archive ?
if (file != null && file.exists() && objectName != null) {
ElfHelper helper = null;
AR ar = null;
try {
ar = new AR(file.getLocation().toOSString());
AR.ARHeader[] headers = ar.getHeaders();
for (int i = 0; i < headers.length; i++) {
if (objectName.equals(headers[i].getObjectName())) {
helper = new ElfHelper(headers[i].getElf());
break;
}
}
} finally {
if (ar != null) {
ar.dispose();
}
}
return helper;
} else if (file != null && file.exists()) {
IPath path = file.getLocation();
if (path == null) {
path = new Path("");
}
return new ElfHelper(path.toOSString());
}
throw new IOException("No file assiocated with Binary");
}
protected void loadInformation() throws IOException {
loadAttributes();
if (symbols != null) {
symbols.clear();
loadSymbols();
symbols.trimToSize();
}
}
protected void loadAttributes() throws IOException {
ElfHelper helper = getElfHelper();
loadAttributes(helper);
helper.dispose();
}
protected void loadAttributes(ElfHelper helper) throws IOException {
Elf.Dynamic[] sharedlibs = helper.getNeeded();
needed = new String[sharedlibs.length];
for (int i = 0; i < sharedlibs.length; i++) {
needed[i] = sharedlibs[i].toString();
}
sizes = helper.getSizes();
soname = helper.getSoname();
attribute = helper.getElf().getAttributes();
}
protected void loadSymbols() throws IOException {
ElfHelper helper = getElfHelper();
loadSymbols(helper);
helper.dispose();
}
protected void loadSymbols(ElfHelper helper) throws IOException {
Elf.Dynamic[] sharedlibs = helper.getNeeded();
needed = new String[sharedlibs.length];
for (int i = 0; i < sharedlibs.length; i++) {
needed[i] = sharedlibs[i].toString();
}
sizes = helper.getSizes();
soname = helper.getSoname();
attribute = helper.getElf().getAttributes();
addSymbols(helper.getExternalFunctions(), ISymbol.FUNCTION);
addSymbols(helper.getLocalFunctions(), ISymbol.FUNCTION);
addSymbols(helper.getExternalObjects(), ISymbol.VARIABLE);
addSymbols(helper.getLocalObjects(), ISymbol.VARIABLE);
symbols.trimToSize();
}
protected void addSymbols(Elf.Symbol[] array, int type) {
for (int i = 0; i < array.length; i++) {
try {
ISymbol sym = new ElfSymbol(array[i], type);
symbols.add(sym);
} catch (IOException e) {
}
}
}
}

View file

@ -0,0 +1,35 @@
package org.eclipse.cdt.internal.core.model.parser;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.io.IOException;
import org.eclipse.cdt.core.model.IBinaryParser;
import org.eclipse.cdt.utils.elf.AR;
import org.eclipse.cdt.utils.elf.Elf;
import org.eclipse.core.resources.IFile;
/**
*/
public class ElfParser implements IBinaryParser {
/**
* @see org.eclipse.cdt.core.model.IBinaryParser#getBinary(IPath)
*/
public IBinaryFile getBinary(IFile file) throws IOException {
try {
Elf e = new Elf(file.getLocation().toOSString());
e.dispose();
return new ElfBinaryFile(file);
} catch (IOException e) {
}
// Is it an Archive.
AR ar = new AR(file.getLocation().toOSString());
ar.dispose();
return new ElfBinaryArchive(file);
}
}