Patching ELF with minimum number of change in bytes
Problem Definition :
I need to patch an elf file. This elf file is produced from the available source code that I have developed. I also have a linker file which is a standard example for my target.
Challenge is to keep changes (byte shifts) in the elf file as minimum when I add a new code line. When I take difference in bytes between original and patched elf files, the first occurrence of byte shift (cause of new code line) is desired to be near end of the elf file.
So adding a new text and data section for patch purpose is a must!
But these sections also be located at the end of elf file.
Here is my test combinations :
What works;
When I add a new functionality to any function, I will rewrite this function in a new source file. And add this function to a new section called patchText (defined in linker file) or whatever. Finally, I change function call instruction manually, it works! But it is manual :( Is there any way to do this automatically?
What does not work;
1) __attribute_((weak)) option -> When I put my patch code after .bss or .data section, linker creates two executable PT_LOAD segments. And When I run the program, it does not work! Because my patch function symbol cannot be resolved.
If I use "weak" attribute without adding new section it works.
So is there any explanation or comment about that? What will be wrong ? or is it possible ?
2) -Wl,-wrap,symboname option : Same problem as in "weak".
Thank you.
c patch elf
add a comment |
Problem Definition :
I need to patch an elf file. This elf file is produced from the available source code that I have developed. I also have a linker file which is a standard example for my target.
Challenge is to keep changes (byte shifts) in the elf file as minimum when I add a new code line. When I take difference in bytes between original and patched elf files, the first occurrence of byte shift (cause of new code line) is desired to be near end of the elf file.
So adding a new text and data section for patch purpose is a must!
But these sections also be located at the end of elf file.
Here is my test combinations :
What works;
When I add a new functionality to any function, I will rewrite this function in a new source file. And add this function to a new section called patchText (defined in linker file) or whatever. Finally, I change function call instruction manually, it works! But it is manual :( Is there any way to do this automatically?
What does not work;
1) __attribute_((weak)) option -> When I put my patch code after .bss or .data section, linker creates two executable PT_LOAD segments. And When I run the program, it does not work! Because my patch function symbol cannot be resolved.
If I use "weak" attribute without adding new section it works.
So is there any explanation or comment about that? What will be wrong ? or is it possible ?
2) -Wl,-wrap,symboname option : Same problem as in "weak".
Thank you.
c patch elf
"is there any other way to achieve this" -- probably. But you didn't tell us what you are actually trying to achieve. See xyproblem.info
– Employed Russian
Nov 22 '18 at 17:15
Thank you @EmployedRussian. I have updated my question.
– vilidigonzales
Dec 11 '18 at 14:19
add a comment |
Problem Definition :
I need to patch an elf file. This elf file is produced from the available source code that I have developed. I also have a linker file which is a standard example for my target.
Challenge is to keep changes (byte shifts) in the elf file as minimum when I add a new code line. When I take difference in bytes between original and patched elf files, the first occurrence of byte shift (cause of new code line) is desired to be near end of the elf file.
So adding a new text and data section for patch purpose is a must!
But these sections also be located at the end of elf file.
Here is my test combinations :
What works;
When I add a new functionality to any function, I will rewrite this function in a new source file. And add this function to a new section called patchText (defined in linker file) or whatever. Finally, I change function call instruction manually, it works! But it is manual :( Is there any way to do this automatically?
What does not work;
1) __attribute_((weak)) option -> When I put my patch code after .bss or .data section, linker creates two executable PT_LOAD segments. And When I run the program, it does not work! Because my patch function symbol cannot be resolved.
If I use "weak" attribute without adding new section it works.
So is there any explanation or comment about that? What will be wrong ? or is it possible ?
2) -Wl,-wrap,symboname option : Same problem as in "weak".
Thank you.
c patch elf
Problem Definition :
I need to patch an elf file. This elf file is produced from the available source code that I have developed. I also have a linker file which is a standard example for my target.
Challenge is to keep changes (byte shifts) in the elf file as minimum when I add a new code line. When I take difference in bytes between original and patched elf files, the first occurrence of byte shift (cause of new code line) is desired to be near end of the elf file.
So adding a new text and data section for patch purpose is a must!
But these sections also be located at the end of elf file.
Here is my test combinations :
What works;
When I add a new functionality to any function, I will rewrite this function in a new source file. And add this function to a new section called patchText (defined in linker file) or whatever. Finally, I change function call instruction manually, it works! But it is manual :( Is there any way to do this automatically?
What does not work;
1) __attribute_((weak)) option -> When I put my patch code after .bss or .data section, linker creates two executable PT_LOAD segments. And When I run the program, it does not work! Because my patch function symbol cannot be resolved.
If I use "weak" attribute without adding new section it works.
So is there any explanation or comment about that? What will be wrong ? or is it possible ?
2) -Wl,-wrap,symboname option : Same problem as in "weak".
Thank you.
c patch elf
c patch elf
edited Dec 11 '18 at 14:15
vilidigonzales
asked Nov 22 '18 at 12:36
vilidigonzalesvilidigonzales
43
43
"is there any other way to achieve this" -- probably. But you didn't tell us what you are actually trying to achieve. See xyproblem.info
– Employed Russian
Nov 22 '18 at 17:15
Thank you @EmployedRussian. I have updated my question.
– vilidigonzales
Dec 11 '18 at 14:19
add a comment |
"is there any other way to achieve this" -- probably. But you didn't tell us what you are actually trying to achieve. See xyproblem.info
– Employed Russian
Nov 22 '18 at 17:15
Thank you @EmployedRussian. I have updated my question.
– vilidigonzales
Dec 11 '18 at 14:19
"is there any other way to achieve this" -- probably. But you didn't tell us what you are actually trying to achieve. See xyproblem.info
– Employed Russian
Nov 22 '18 at 17:15
"is there any other way to achieve this" -- probably. But you didn't tell us what you are actually trying to achieve. See xyproblem.info
– Employed Russian
Nov 22 '18 at 17:15
Thank you @EmployedRussian. I have updated my question.
– vilidigonzales
Dec 11 '18 at 14:19
Thank you @EmployedRussian. I have updated my question.
– vilidigonzales
Dec 11 '18 at 14:19
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431198%2fpatching-elf-with-minimum-number-of-change-in-bytes%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53431198%2fpatching-elf-with-minimum-number-of-change-in-bytes%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
"is there any other way to achieve this" -- probably. But you didn't tell us what you are actually trying to achieve. See xyproblem.info
– Employed Russian
Nov 22 '18 at 17:15
Thank you @EmployedRussian. I have updated my question.
– vilidigonzales
Dec 11 '18 at 14:19