• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Can an NSString literal's bytes be moved to a different section of the executable?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Can an NSString literal's bytes be moved to a different section of the executable?


  • Subject: Re: Can an NSString literal's bytes be moved to a different section of the executable?
  • From: Wim Lewis <email@hidden>
  • Date: Wed, 24 Feb 2016 18:15:12 -0800


On Feb 24, 2016, at 5:26 PM, Jens Alfke <email@hidden> wrote:
Is there a way to control which section of the executable a specific NSString literal goes into? I’ve tried using the ‘section’ attribute, but it has no effect:

I think that syntax is adding the attribute to the type, not to the variable. A pointer-to-something-in-a-section-X is not, itself, necessarily in section X. (But I'm never quite sure about the placement of __attribute__s.)

You can place the kFoo variable itself into a specific section by placing the annotation after its name. But all that does is move the statically-allocated CFString pointer to another section, which I assume isn't what you want.

As far as I know, there's no way to annotate a *value* using the __attribute__ notation, which is what you want if you want the actual textual stuff to go into another section. But a CFString/NSString literal actually creates stuff in two sections: the __cstring section (holding the C string value) and the __cfstring section (holding the statically-allocated CFConstantStringClassReference object, which is a few machine words long). 

__attribute__((section(“__TEXT,__foo”))) static NSString* const kFoo = @“Foobar”;
The above doesn’t change where the string appears; there is no __TEXT,__foo section in the binary at all, and the string is still in the default __TEXT,__cstring section.


(FYI, although this doesn't apply to your case I don't think, I've found using repeated @string literals (via a #define, for maintainability) to be somewhat more compact than "static NSString * const foo". CFString literals (including @"foo" strings) are uniqued by the linker, so in general you'll end up sharing a single instance within the framework anyway.)

You can place a C string into a specific section using syntax like this:

   static __attribute__((section("__TEXT,foo"))) const char foo_var[] = "Foo, forsooth.";

This works because the quoted string is acting as an initializer, rather than as a string literal, and foo_var[] is annotated as being in a specific section. (This also keeps the linker from merging identical cstrings, since array variables are distinct).

(We do this for reasons similar to yours, segregating some cold strings which we know wouldn't benefit from deduplication.)

There's also an __attribute__((cold)), which is documented to be useful for situations like this, including basic-block reordering, but I don't know if the Xcode toolchain does anything with it.

If you're desperate, I suppose, you could cobble together your own CFConstantString instances pointing to string data in whatever section you like, using __asm__ blocks, but that might be brittle. :)


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Can an NSString literal's bytes be moved to a different section of the executable?
      • From: Jens Alfke <email@hidden>
References: 
 >Can an NSString literal's bytes be moved to a different section of the executable? (From: Jens Alfke <email@hidden>)

  • Prev by Date: Can an NSString literal's bytes be moved to a different section of the executable?
  • Next by Date: Re: Can an NSString literal's bytes be moved to a different section of the executable?
  • Previous by thread: Can an NSString literal's bytes be moved to a different section of the executable?
  • Next by thread: Re: Can an NSString literal's bytes be moved to a different section of the executable?
  • Index(es):
    • Date
    • Thread