mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-31 21:05:37 +02:00
Framework for the IBinaryParser for Elf.
This commit is contained in:
parent
8e7d223aa9
commit
afe548ff84
5 changed files with 1039 additions and 0 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue